Myślę, że tego szukasz:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Daje żądany wynik.
Funkcje okna są stosowane po funkcje agregujące. Zewnętrzna sum()
w sum(sum(v)) OVER ...
to funkcja okna (dołączona OVER ...
klauzula) podczas gdy wewnętrzna sum()
jest funkcją agregującą.
Skutecznie to samo co:
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;
Lub (bez 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;
Lub wariant @Mu.
Na marginesie:Greenplum wprowadził skorelowane podzapytania w wersji 4.2. Zobacz informacje o wydaniu.