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

Вземете отделната сума от колона на присъединена таблица

За да получите резултата без подзаявка , трябва да прибягвате до измама с разширени функции на прозореца:

SELECT sum(count(*))       OVER () AS tickets_count
     , sum(min(a.revenue)) OVER () AS atendees_revenue
FROM   tickets   t
JOIN   attendees a ON a.id = t.attendee_id
GROUP  BY t.attendee_id
LIMIT  1;

sqlfiddle

Как работи?

Ключът към разбирането на това епоследователността от събития в заявката:

обобщени функции -> функции на прозореца -> DISTINCT -> LIMIT

Повече подробности:

  • Най-добрият начин да получите резултат, преди да бъде приложен LIMIT

Стъпка по стъпка:

  1. I GROUP BY t.attendee_id - което обикновено правите в подзаявка.

  2. След това сумирам преброяванията, за да получа общия брой на билетите. Не е много ефективно, но принудено от вашето изискване. Агрегатната функция count(*) е обвит във функцията на прозореца sum( ... ) OVER () за да стигнем до не толкова често срещания израз:sum(count(*)) OVER () .

    И сумирайте минималните приходи на присъстващ, за да получите сумата без дубликати.

    Можете също да използвате max() или avg() вместо min() със същия ефект като revenue е гарантирано, че е една и съща за всеки ред на присъстващ.

    Това може да бъде по-лесно, ако DISTINCT беше разрешено във функциите на прозореца, но PostgreSQL (все още) не е внедрил тази функция. По документация:

    Функциите на прозореца за обобщени, за разлика от нормалните агрегатни функции, не позволяват DISTINCT или ORDER BY да се използва в списъка с аргументи на функцията.

  3. Последната стъпка е да получите един ред. Това може да стане с DISTINCT (SQL стандарт), тъй като всички редове са еднакви. LIMIT 1 все пак ще е по-бързо. Или стандартния SQL формуляр FETCH FIRST 1 ROWS ONLY .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Подобряване на функция, която UPSERTs въз основа на входен масив

  2. XMLTABLE в PostgreSQL

  3. PG::UndefinedTable:ГРЕШКА:релация не съществува с правилно именуване и конвенция на Rails

  4. Връзката, предадена на # или трябва да е структурно съвместима. Несъвместими стойности:[:references]

  5. Пропускане на двойните кавички за извършване на заявка в PostgreSQL