ホームページ > データベース > mysql チュートリアル > PostgreSQL で個別のフィルターを使用して列を効率的に集計するにはどうすればよいですか?

PostgreSQL で個別のフィルターを使用して列を効率的に集計するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-22 17:11:38
オリジナル
781 人が閲覧しました

How Can I Efficiently Aggregate Columns with Distinct Filters in PostgreSQL?

PostgreSQL の効率的な集計列と個別フィルター

次のコードは、プレイされたゲーム、勝ったゲーム、負けたゲームという 3 つの別々の集計列のデータを取得します。このコードは期待どおりに機能しますが、繰り返しが多く、保守が困難になる可能性があります。このクエリを簡素化するには、高度な PostgreSQL 機能の使用を検討してください。

PostgreSQL 9.4 以降

PostgreSQL 9.4 では、新しい集計 FILTER 句が導入されています。この句を使用すると、指定したブール式を満たす行のみを考慮して、集計計算にフィルターを適用できます。

<code class="language-sql">SELECT u.name
     , count(*) FILTER (WHERE g.winner_id > 0)    AS played
     , count(*) FILTER (WHERE g.winner_id = u.id) AS won
     , count(*) FILTER (WHERE g.winner_id != u.id) AS lost
FROM   games g
JOIN   users u ON u.id IN (g.player_1_id, g.player_2_id)
GROUP  BY u.name;</code>
ログイン後にコピー

9.4 より前の PostgreSQL バージョン

PostgreSQL の以前のバージョンでは、回避策として式 (式 OR NULL) を使用できます。

<code class="language-sql">SELECT u.name
     , count(g.winner_id > 0 OR NULL)    AS played
     , count(g.winner_id = u.id OR NULL) AS won
     , count(g.winner_id != u.id OR NULL) AS lost
FROM   games g
JOIN   users u ON u.id IN (g.player_1_id, g.player_2_id)
GROUP  BY u.name;</code>
ログイン後にコピー

この回避策は、ネストされた副選択または CASE 式を使用するよりも短くて高速です。最適化に関するさらなる考慮事項については、提供された回答に記載されている参考資料を参照してください。

以上がPostgreSQL で個別のフィルターを使用して列を効率的に集計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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