PostgreSQL の条件カウント: CASE ステートメントと FILTER の効率比較
効率的な統計テーブルにおけるデータの出現頻度は非常に重要です。 PostgreSQLでは一般的に条件付きカウントにCASE文を使用しますが、取り得る値の数が増えるとこの方法は煩雑になります。
カウントには SUM(CASE WHEN) を使用します:
<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>
カウントには COUNT(CASE WHEN) を使用します:
<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>
CASE ステートメントの制限:
これらのメソッドは条件付きカウントを実装できますが、次のような欠点があります。
PostgreSQL 9.4 バージョンでのカウントを最適化するには FILTER を使用します:
PostgreSQL 9.4 以降の場合、FILTER 集計オプションは効率的なソリューションを提供します。
<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>
このメソッドは、FILTER 句を使用してさまざまなフィルターを適用し、追加の CASE ステートメントのオーバーヘッドを回避します。
構文を簡略化するには、OR NULL を使用します:
より簡潔にするために、OR NULL を使用できます:
<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>
複素数のクロス集計クエリ:
crosstab() 関数は、多数のオプションを処理する場合に最高のパフォーマンスとシンプルさを提供します。
<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>
つまり、PostgreSQL の FILTER オプションと OR NULL 構文は、条件付きカウントのための効率的で便利な方法を提供し、crosstab() 関数は複雑なカウント シナリオで適切に機能します。
以上がCASE ステートメント、FILTER、または Crosstab() を使用して PostgreSQL で条件付きカウントを効率的に実行する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。