PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Colunas agregadas com filtros adicionais (distintos)


O agregado FILTER cláusula no Postgres 9.4 ou mais recente é mais curto e mais rápido:
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;
  • Manual
  • Postgres Wiki
  • Postagem do blog Depesz

No Postgres 9.3 (ou qualquer versão) ainda é mais curto e mais rápido que sub-seleções aninhadas ou CASE expressões:
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;

Detalhes:
  • Para desempenho absoluto, SUM é mais rápido ou COUNT?