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

SQL Server — agregacja warunkowa z korelacją

Jest prostsze rozwiązanie:

SELECT c.Customer, c."User", c."Revenue",
       1.0 * Revenue/ NULLIF(c2.sum_total, 0) AS percentage,
       1.0 * c2.sum_running / NULLIF(c2.sum_total, 0) AS running_percentage
FROM t c CROSS APPLY
     (SELECT SUM(c2.Revenue) AS sum_total,
             SUM(CASE WHEN c2.Revenue >= x.Revenue THEN c2.Revenue ELSE 0 END) 
                 as sum_running
      FROM t c2 CROSS JOIN
           (SELECT c.REVENUE) x
      WHERE c."User" = c2."User"
     ) c2
ORDER BY "User", Revenue DESC;

Nie jestem pewien, dlaczego i czy to ograniczenie jest w standardzie SQL '92. Znałem to całkiem dobrze 20 lat temu, ale nie pamiętam tego konkretnego ograniczenia.

Powinienem zauważyć:

  • W czasach standardu SQL 92 sprzężenia boczne nie były tak naprawdę widoczne. Sybase zdecydowanie nie miało takiej koncepcji.
  • Inne bazy danych do mieć problemy z odnośnikami zewnętrznymi. W szczególności często ograniczają zakres do jednego poziomu głębokości.
  • Sam standard SQL jest raczej polityczny (tj. oparty na dostawcy), niż wynikający z rzeczywistych wymagań użytkownika bazy danych. Cóż, z biegiem czasu zmierza we właściwym kierunku.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak załadować dane do pand z dużej bazy danych?

  2. Ograniczenie zdefiniowane ODROCZONY POCZĄTKOWO NATYCHMIAST jest nadal ODROCZONY?

  3. PostgreSQL PL/Python:wywołanie procedury składowanej w virtualenv

  4. Jak przełączać się między operacją indeksowaną i nieindeksowaną w zależności od danych wejściowych?

  5. Wpisz Java w JDBC do Postgres ltree