PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Kolumny agregujące z dodatkowymi (odrębnymi) filtrami

agregacja FILTER klauzula w Postgresie 9.4 lub nowszy jest krótszy i szybszy:

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;
  • Instrukcja
  • Wiki Postgres
  • Wpis na blogu Depesz

W Postgresie 9.3 (lub dowolny wersja) jest to nadal krótsze i szybsze niż zagnieżdżone sekcje podrzędne lub CASE wyrażenia:

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;

Szczegóły:

  • Aby uzyskać bezwzględną wydajność, czy SUM jest szybszy czy COUNT?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL - klauzula GROUP BY lub być używana w funkcji agregującej

  2. Czy istnieje sposób na wyłączenie aktualizacji/usuwania, ale nadal zezwalanie na ich wykonywanie przez wyzwalacze?

  3. Zaktualizuj wiele kolumn w funkcji wyzwalacza w plpgsql

  4. Automatyczne zwiększanie częściowego klucza podstawowego za pomocą Entity Framework Core

  5. Jak uzyskać licznik niedzieli w bieżącym miesiącu w psql?