Je pense que vous cherchez ceci :
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Produit le résultat demandé.
Les fonctions de fenêtre sont appliquées après fonctions d'agrégation. Le sum()
externe dans sum(sum(v)) OVER ...
est une fonction de fenêtre (joint OVER ...
clause) tandis que le sum()
intérieur est une fonction d'agrégation.
Effectivement identique à :
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 (sans 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 la variante de @Mu.
A part :Greenplum a introduit des sous-requêtes corrélées avec la version 4.2. Voir les notes de version.