ホームページ > データベース > mysql チュートリアル > CASE ステートメント、FILTER、または Crosstab() を使用して PostgreSQL で条件付きカウントを効率的に実行する方法は?

CASE ステートメント、FILTER、または Crosstab() を使用して PostgreSQL で条件付きカウントを効率的に実行する方法は?

DDD
リリース: 2025-01-24 06:16:13
オリジナル
117 人が閲覧しました

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

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 ステートメントの制限:

これらのメソッドは条件付きカウントを実装できますが、次のような欠点があります。

  • 長いコード: 複数の CASE ステートメントを記述するとエラーが発生しやすく、非効率的です。
  • パフォーマンスの問題: CASE 式と ELSE 0 を使用すると、パフォーマンスに影響を与える可能性があります。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート