Мне нужно вычислить проценты различных измерений в таблице. Я хотел бы упростить задачу, используя оконные функции для вычисления знаменателя, однако у меня возникает проблема, поскольку числитель также должен быть агрегатом.
В качестве простого примера возьмем следующую таблицу:
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 не может делать коррелированные подзапросы.