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.