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