Jag tror att du letar efter detta:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Ger det begärda resultatet.
Fönsterfunktioner tillämpas efter samla funktioner. Den yttre sum()
i sum(sum(v)) OVER ...
är en fönsterfunktion (bifogad OVER ...
sats) medan den inre sum()
är en aggregerad funktion.
I praktiken samma sak som:
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;
Eller (utan 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;
Eller @Mus variant.
Bortsett från:Greenplum introducerade korrelerade underfrågor med version 4.2. Se release notes.