PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

SQL Server:aggregazione condizionale con correlazione

C'è una soluzione più semplice:

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;

Non sono sicuro del perché o se questa limitazione sia nello standard SQL '92. L'avevo memorizzato abbastanza bene circa 20 anni fa, ma non ricordo quella particolare limitazione.

Dovrei notare:

  • Ai tempi dello standard SQL 92, i join laterali non erano davvero sul radar. Sybase non aveva assolutamente un concetto del genere.
  • Altri database lo fanno avere problemi con i riferimenti esterni. In particolare, spesso limitano lo scoping a un livello di profondità.
  • Lo stesso standard SQL tende a essere altamente politico (ovvero guidato dal fornitore) piuttosto che guidato dai requisiti effettivi degli utenti del database. Bene, nel tempo, si muove nella giusta direzione.