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>
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>
Einschränkungen der CASE-Anweisung:
Obwohl diese Methoden bedingtes Zählen implementieren können, haben sie Nachteile:
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>
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>
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>
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!