Ik denk dat je dit zoekt:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Produceert het gevraagde resultaat.
Vensterfuncties worden na . toegepast geaggregeerde functies. De buitenste sum()
in sum(sum(v)) OVER ...
is een vensterfunctie (bijgevoegd OVER ...
clausule) terwijl de binnenste sum()
is een geaggregeerde functie.
In feite hetzelfde als:
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;
Of (zonder 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;
Of de variant van @Mu.
Terzijde:Greenplum introduceerde gecorreleerde subquery's met versie 4.2. Zie release-opmerkingen.