Creo que estás buscando esto:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Produce el resultado solicitado.
Las funciones de ventana se aplican después Funciones agregadas. El exterior sum()
en sum(sum(v)) OVER ...
es una función de ventana (adjunto OVER ...
cláusula) mientras que el sum()
interno es una función agregada.
Efectivamente lo mismo 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;
O (sin 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 de @Mu.
Aparte:Greenplum introdujo subconsultas correlacionadas con la versión 4.2. Consulte las notas de la versión