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

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

DDD
リリース: 2025-01-22 17:32:41
オリジナル
605 人が閲覧しました

How Can I Efficiently Aggregate Game Statistics with Distinct Filters in PostgreSQL?

PostgreSQL でのゲーム統計集計の合理化

ゲーム統計を集計するための元のコードは非常に複雑です。この改訂されたアプローチにより、プレーヤーの名前とゲーム数 (プレイ、勝ち、負け) を取得する際のプロセスが簡素化されます。

PostgreSQL 9.4 以降 (FILTER 句を使用)

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>
ログイン後にコピー

FILTER 句は、集計関数に条件を効率的に適用し、可読性とパフォーマンスを向上させます。

PostgreSQL のすべてのバージョン (回避策)

FILTER 句がない古い PostgreSQL バージョンの場合、次の回避策で同じ結果が得られます。

<code class="language-sql">SELECT u.name,
       COUNT(CASE WHEN g.winner_id > 0 THEN 1 END) AS played,
       COUNT(CASE WHEN g.winner_id = u.id THEN 1 END) AS won,
       COUNT(CASE WHEN g.winner_id != u.id THEN 1 END) 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 ステートメントによる条件付き集計を使用して、目的のフィルタリングを実現します。 すべてのバージョンで機能しますが、明確さと効率性のために FILTER 句 (使用可能な場合) を使用することをお勧めします。

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

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