Как использовать оконную функцию SQL для вычисления процентной доли агрегата

Мне нужно вычислить проценты различных измерений в таблице. Я хотел бы упростить задачу, используя оконные функции для вычисления знаменателя, однако у меня возникает проблема, поскольку числитель также должен быть агрегатом.

В качестве простого примера возьмем следующую таблицу:

create temp table test (d1 text, d2 text, v numeric);
insert into test values ('a','x',5), ('a','y',5), ('a','y',10), ('b','x',20);

Если я просто хочу вычислить долю каждой отдельной строки из d1, то оконные функции работают отлично:

select d1, d2, v/sum(v) over (partition by d1)
from test;

"b";"x";1.00
"a";"x";0.25
"a";"y";0.25
"a";"y";0.50

Однако мне нужно вычислить общую долю для суммы d2 из d1. Вывод, который я ищу, выглядит так:

"b";"x";1.00
"a";"x";0.25
"a";"y";0.75

Поэтому я пробую так:

select d1, d2, sum(v)/sum(v) over (partition by d1)
from test
group by d1, d2;

Однако теперь я получаю ошибку:

ERROR:  column "test.v" must appear in the GROUP BY clause or be used in an aggregate function

Я предполагаю, что это потому, что он жалуется, что оконная функция не учтена в пункте группировки, однако оконные функции в любом случае не могут быть помещены в пункт группировки.

Это происходит при использовании Greenplum 4.1, который является форком Postgresql 8.4 и имеет те же оконные функции. Обратите внимание, что Greenplum не может делать коррелированные подзапросы.

14
задан Erwin Brandstetter 9 March 2013 в 04:11
поделиться