Jeg tror, du leder efter dette:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Frembringer det ønskede resultat.
Vinduesfunktioner anvendes efter aggregerede funktioner. Den ydre sum()
i sum(sum(v)) OVER ...
er en vinduesfunktion (vedhæftet OVER ...
klausul), mens den indre sum()
er en aggregeret funktion.
Faktisk det samme som:
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;
Eller (uden 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;
Eller @Mu's variant.
Til side:Greenplum introducerede korrelerede underforespørgsler med version 4.2. Se udgivelsesbemærkninger.