PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SQL Server – bedingte Aggregation mit Korrelation

Es gibt eine einfachere Lösung:

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;

Ich bin mir nicht sicher, warum oder ob diese Einschränkung im SQL '92-Standard enthalten ist. Ich hatte es vor ungefähr 20 Jahren ziemlich gut auswendig gelernt, aber ich erinnere mich nicht an diese spezielle Einschränkung.

Ich sollte beachten:

  • Zum Zeitpunkt des SQL 92-Standards waren Lateral Joins nicht wirklich auf dem Radar. Sybase hatte definitiv kein solches Konzept.
  • Andere Datenbanken tun Probleme mit Außenbezügen haben. Insbesondere begrenzen sie den Geltungsbereich oft auf eine Ebene tief.
  • Der SQL-Standard selbst ist in der Regel sehr politisch (d. h. anbietergesteuert) und nicht von den tatsächlichen Anforderungen der Datenbankbenutzer bestimmt. Nun, mit der Zeit bewegt es sich in die richtige Richtung.