Мисля, че търсите това:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Получава искания резултат.
Функциите на прозореца се прилагат след агрегатни функции. Външният sum() в sum(sum(v)) OVER ... е прозоречна функция (прикачена OVER ... клауза), докато вътрешната sum() е агрегатна функция.
Ефективно същото като:
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;
Или (без 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;
Или вариантът на @Mu.
Настрана:Greenplum въведе корелирани подзаявки с версия 4.2. Вижте бележките по изданието.