Heim > Datenbank > MySQL-Tutorial > Wie führt man bedingte Zählungen in PostgreSQL mithilfe von CASE-Anweisungen, FILTER oder Crosstab() effizient durch?

Wie führt man bedingte Zählungen in PostgreSQL mithilfe von CASE-Anweisungen, FILTER oder Crosstab() effizient durch?

DDD
Freigeben: 2025-01-24 06:16:13
Original
158 Leute haben es durchsucht

How to Efficiently Perform Conditional Counts in PostgreSQL Using CASE Statements, FILTER, or Crosstab()?

PostgreSQL-Bedingungszählung: Effizienzvergleich zwischen CASE-Anweisung und FILTER

Die Häufigkeit des Datenvorkommens in effizienten statistischen Tabellen ist entscheidend. PostgreSQL verwendet üblicherweise die CASE-Anweisung zum bedingten Zählen, diese Methode wird jedoch umständlich, wenn die Anzahl der möglichen Werte zunimmt.

Verwenden Sie SUM(CASE WHEN) zum Zählen:

<code class="language-sql">SELECT
    sum(CASE WHEN question1 = 0 THEN 1 ELSE 0 END) AS ZERO,
    sum(CASE WHEN question1 = 1 THEN 1 ELSE 0 END) AS ONE,
    sum(CASE WHEN question1 = 2 THEN 1 ELSE 0 END) AS TWO,
    category
FROM reviews
GROUP BY category</code>
Nach dem Login kopieren

Verwenden Sie COUNT(CASE WHEN) zum Zählen:

<code class="language-sql">SELECT
    count(CASE WHEN question1 = 0 THEN 1 END) AS ZERO,
    count(CASE WHEN question1 = 1 THEN 1 END) AS ONE,
    count(CASE WHEN question1 = 2 THEN 1 END) AS TWO,
    category
FROM reviews
GROUP BY category</code>
Nach dem Login kopieren

Einschränkungen der CASE-Anweisung:

Obwohl diese Methoden bedingtes Zählen implementieren können, haben sie Nachteile:

  • Langer Code: Das Schreiben mehrerer CASE-Anweisungen ist fehleranfällig und ineffizient.
  • Leistungsproblem: Die Verwendung von CASE-Ausdrücken und ELSE 0 kann sich auf die Leistung auswirken.

Verwenden Sie FILTER, um die Zählung in der PostgreSQL 9.4-Version zu optimieren:

Für PostgreSQL 9.4 und höher bietet die FILTER-Aggregationsoption eine effiziente Lösung:

<code class="language-sql">SELECT category
     , count(*) FILTER (WHERE question1 = 0) AS zero
     , count(*) FILTER (WHERE question1 = 1) AS one
     , count(*) FILTER (WHERE question1 = 2) AS two
FROM   reviews
GROUP  BY 1;</code>
Nach dem Login kopieren

Diese Methode verwendet die FILTER-Klausel, um verschiedene Filter anzuwenden und so den Overhead zusätzlicher CASE-Anweisungen zu vermeiden.

Verwenden Sie OR NULL, um die Syntax zu vereinfachen:

Für mehr Prägnanz können Sie OR NULL verwenden:

<code class="language-sql">SELECT category
     , count(question1 = 0 OR NULL) AS zero
     , count(question1 = 1 OR NULL) AS one
     , count(question1 = 2 OR NULL) AS two
FROM   reviews
GROUP  BY 1;</code>
Nach dem Login kopieren

Kreuztabellenabfrage für komplexe Zählungen:

Die Funktion crosstab() bietet die beste Leistung und Einfachheit beim Umgang mit einer großen Anzahl von Optionen:

<code class="language-sql">SELECT * FROM crosstab(
     'SELECT category, question1, count(*) AS ct
      FROM   reviews
      GROUP  BY 1, 2
      ORDER  BY 1, 2'
   , 'VALUES (0), (1), (2)'
   ) AS ct (category text, zero int, one int, two int);</code>
Nach dem Login kopieren

Kurz gesagt: Die FILTER-Option und die OR NULL-Syntax von PostgreSQL bieten effiziente und praktische Methoden für das bedingte Zählen, und die Funktion crosstab() eignet sich gut für komplexe Zählszenarien.

Das obige ist der detaillierte Inhalt vonWie führt man bedingte Zählungen in PostgreSQL mithilfe von CASE-Anweisungen, FILTER oder Crosstab() effizient durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage