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

So verwenden Sie eine SQL-Fensterfunktion, um einen Prozentsatz eines Aggregats zu berechnen

Ich glaube, Sie suchen das hier:

SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM   test
GROUP  BY d1, d2;

Erzeugt das angeforderte Ergebnis.

Fensterfunktionen werden nach angewendet aggregierte Funktionen. Die äußere sum() in sum(sum(v)) OVER ... ist eine Fensterfunktion (angehängt OVER ... -Klausel), während die innere sum() ist eine Aggregatfunktion.

Im Grunde dasselbe wie:

WITH x AS (
   SELECT d1, d2, sum(v) AS sv
   FROM   test
   GROUP  BY d1, d2
   )
SELECT d1, d2, sv/sum(sv) OVER (PARTITION BY d1) AS share
FROM   x;

Oder (ohne CTE):

SELECT d1, d2, sv/sum(sv) OVER (PARTITION BY d1) AS share
FROM  (
   SELECT d1, d2, sum(v) AS sv
   FROM   test
   GROUP  BY d1, d2
   ) x;

Oder die Variante von @Mu.

Übrigens:Greenplum hat mit Version 4.2 korrelierte Unterabfragen eingeführt. Siehe Versionshinweise.