PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aggregierte Spalten mit zusätzlichen (unterschiedlichen) Filtern

Der zusammengefasste FILTER Klausel in Postgres 9.4 oder neuer ist kürzer und schneller:

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;
  • Das Handbuch
  • Postgres-Wiki
  • Depesz-Blogbeitrag

In Postgres 9.3 (oder beliebige Version) ist dies immer noch kürzer und schneller als verschachtelte Sub-Selects oder CASE Ausdrücke:

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;

Einzelheiten:

  • Ist für die absolute Leistung SUM schneller oder COUNT?