集計FILTER
条項 Postgresで9.4 または新しい方が短くて速い:
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;
- マニュアル
- Postgres Wiki
- Depeszブログ投稿
Postgresで9.3 (または任意 バージョン)これは、ネストされたサブ選択またはCASE
よりもさらに短く高速です。 式:
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;
詳細:
- 絶対的なパフォーマンスのために、SUMは高速ですか、それともCOUNTですか?