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

Uzyskaj wyraźną sumę połączonej kolumny tabeli

Aby uzyskać wynik bez podzapytania , musisz uciec się do zaawansowanych sztuczek funkcji okna:

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

Jak to działa?

Kluczem do zrozumienia tego jest sekwencja wydarzeń w zapytaniu:

funkcje agregujące -> funkcje okien -> DISTINCT -> LIMIT

Więcej szczegółów:

  • Najlepszy sposób na uzyskanie liczby wyników przed zastosowaniem LIMITu

Krok po kroku:

  1. I GROUP BY t.attendee_id - co normalnie zrobiłbyś w podzapytaniu.

  2. Następnie sumuję liczniki, aby uzyskać całkowitą liczbę biletów. Niezbyt wydajny, ale wymuszony przez twoje wymagania. Funkcja agregująca count(*) jest opakowany w funkcję okna sum( ... ) OVER () aby dojść do niezbyt powszechnego wyrażenia:sum(count(*)) OVER () .

    I zsumuj minimalny przychód na uczestnika, aby otrzymać sumę bez duplikatów.

    Możesz także użyć max() lub avg() zamiast min() działa tak samo jak revenue gwarantuje, że będzie taki sam dla każdego wiersza na uczestnika.

    Może to być prostsze, jeśli DISTINCT było dozwolone w funkcjach okien, ale PostgreSQL nie zaimplementował (jeszcze) tej funkcji. Zgodnie z dokumentacją:

    Funkcje okna agregującego, w przeciwieństwie do normalnych funkcji agregujących, nie pozwalają na DISTINCT lub ORDER BY do użycia na liście argumentów funkcji.

  3. Ostatnim krokiem jest uzyskanie jednego rzędu. Można to zrobić za pomocą DISTINCT (standard SQL), ponieważ wszystkie wiersze są takie same. LIMIT 1 będzie jednak szybszy. Lub standardowy formularz 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. Zainstaluj icu4c w wersji 63 z Homebrew

  2. Jak zaznaczyć określoną liczbę wierszy w tabeli przy dostępie równoczesnym?

  3. Czy INSERT [...] ON CONFLICT można użyć do naruszeń kluczy obcych?

  4. PostgreSQL - jak renderować datę w innej strefie czasowej?

  5. Jak połączyć się z PostgreSQL bez podawania nazwy bazy danych?