ホームページ >データベース >mysql チュートリアル >PostgreSQL で個別のフィルターを使用してゲーム統計の集計を簡素化するにはどうすればよいですか?
次のコードは、各プレイヤーがプレイしたゲーム数、勝った数、負けた数をカウントします。ただし、その長さと複雑さが課題を引き起こします。このクエリを簡素化するにはどうすればよいでしょうか?
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 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 サイトの他の関連記事を参照してください。