PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Colonne aggregate con filtri (distinti) aggiuntivi

L'aggregato FILTER clausola in Postgres 9.4 o più recente è più breve e più veloce:

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;
  • Il manuale
  • Wiki Postgres
  • Post del blog Depesz

In Postgres 9.3 (o qualsiasi versione) questo è ancora più breve e più veloce delle selezioni secondarie nidificate o di CASE espressioni:

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;

Dettagli:

  • Per prestazioni assolute, SUM è più veloce o COUNT?