PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Агрегирани колони с допълнителни (отличителни) филтри

Агрегираният FILTER клаузата в Postgres 9.4 или по-нова е по-кратка и по-бърза:

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;
  • Ръководството
  • Postgres Wiki
  • Публикация в блога на Depesz

В Postgres 9.3 (или който и да е версия) това все още е по-кратко и по-бързо от вложените подселекции или CASE изрази:

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;

Подробности:

  • За абсолютна ефективност, SUM е по-бърз или 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

  2. Как да настроите отдалечена връзка с PostgreSQL

  3. Как да настроите PostgreSQL база данни в Django

  4. Случайно премахнати привилегиите на суперпотребител по подразбиране на postgres - мога ли да ги върна?

  5. PostgreSQL обучение за MySQLers