Myslím, že hledáte toto:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Vytvoří požadovaný výsledek.
Funkce okna se použijí po agregační funkce. Vnější sum()
v sum(sum(v)) OVER ...
je funkce okna (připojená OVER ...
klauzule), zatímco vnitřní sum()
je agregační funkce.
Účinně stejné jako:
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;
Nebo (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;
Nebo varianta @Mu.
Stranou:Greenplum zavedl korelované poddotazy s verzí 4.2. Viz poznámky k vydání.