Acho que você está procurando por isso:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Produz o resultado solicitado.
As funções da janela são aplicadas depois funções agregadas. A
sum()
externa em sum(sum(v)) OVER ...
é uma função de janela (anexa OVER ...
cláusula) enquanto a sum()
interna é uma função agregada. Efetivamente o mesmo que:
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;
Ou (sem 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;
Ou a variante de @Mu.
À parte:Greenplum introduziu subconsultas correlacionadas com a versão 4.2. Consulte as notas da versão.