Мисля, че търсите това:
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. Вижте бележките по изданието.