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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-22 17:16:10383ブラウズ

How Can I Simplify Aggregating Game Statistics with Distinct Filters in PostgreSQL?

追加の (異なる) フィルターを使用した列の集計

次のコードは、各プレイヤーがプレイしたゲーム数、勝った数、負けた数をカウントします。ただし、その長さと複雑さが課​​題を引き起こします。このクエリを簡素化するにはどうすればよいでしょうか?

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>

任意の PostgreSQL バージョン

強調 PostgreSQL 9.4 では FILTER 句が導入されました。古いバージョンの場合は、次の回避策があります:

<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>

注: PostgreSQL の古いバージョンのソリューションでは、CASE 句の代わりに FILTER ステートメントを使用して、同じ効果を実現します。 どちらのメソッドもプレーヤーのゲーム統計を正確に計算しますが、FILTER 句の方が読みやすく保守しやすいという利点があります。

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

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