sql >> Databasteknik >  >> RDS >> PostgreSQL

Aggregera kolumner med ytterligare (distinkta) filter

Det samlade FILTER klausul i Postgres 9.4 eller nyare är kortare och snabbare:

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;
  • Handboken
  • Postgres Wiki
  • Depesz blogginlägg

I Postgres 9.3 (eller vilken som helst version) detta är fortfarande kortare och snabbare än kapslade underval eller CASE uttryck:

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;

Detaljer:

  • För absolut prestanda, är SUM snabbare eller COUNT?


  1. Vad är det mest effektiva sättet att kontrollera om en post finns i Oracle?

  2. SQL Server Failover Cluster Installation -1

  3. Rails Migration:Bigint på PostgreSQL verkar misslyckas?

  4. SQL Server String Sammansättning med Null