FILTER
tổng hợp mệnh đề trong Postgres 9.4 hoặc mới hơn ngắn hơn và nhanh hơn:
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;
- Hướng dẫn sử dụng
- Postgres Wiki
- Bài đăng trên blog của Depesz
Trong Postgres 9.3 (hoặc bất kỳ phiên bản) này vẫn ngắn hơn và nhanh hơn các lựa chọn con lồng nhau hoặc CASE
biểu thức:
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;
Chi tiết:
- Để có hiệu suất tuyệt đối, SUM nhanh hơn hay COUNT?