ホームページ >データベース >mysql チュートリアル >PostgreSQL を使用してグループ化されたデータの出現を最適にカウントする方法

PostgreSQL を使用してグループ化されたデータの出現を最適にカウントする方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-24 06:14:16576ブラウズ

How to Optimally Count Occurrences in Grouped Data Using PostgreSQL?

PostgreSQL のグループ化データの出現数を効率的にカウントします

PostgreSQL は、グループ化されたテーブル内のデータの出現をカウントするためのさまざまな方法を提供します。たとえば、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>

しかし、取り得る値の数が増えると、CASE WHEN ステートメントの使用はますます面倒になります。 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>

簡潔にするために、簡略化された構文を使用できます:

<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 は条件付き SQL カウントのための複数の方法を提供します。 FILTER オプションは簡潔で効率的なソリューションを提供し、crosstab() 関数は多数のオプションを処理するための最高のパフォーマンスを提供します。

以上がPostgreSQL を使用してグループ化されたデータの出現を最適にカウントする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。