Агрегираният 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?