Penso che tu stia cercando questo:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Produce il risultato richiesto.
Le funzioni della finestra vengono applicate dopo funzioni aggregate. Il sum()
esterno in sum(sum(v)) OVER ...
è una funzione della finestra (allegata OVER ...
clausola) mentre il sum()
interno è una funzione aggregata.
Effettivamente lo stesso di:
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;
Oppure (senza 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;
O la variante di @Mu.
A parte:Greenplum ha introdotto sottoquery correlate con la versione 4.2. Vedi le note sulla versione.