Мне нужно рассчитать проценты различных размеров в таблице. Я хотел бы упростить вещи, используя функции окна для вычисления знаменателя, однако у меня проблема, потому что числитель также должен быть агрегатом.Как использовать функцию окна 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
Я предполагаю, что это происходит потому, он жалуется, что функция window не учитывается в предложении группировки, однако в любом случае функции группировки не могут быть помещены в предложение группировки.
Это использование Greenplum 4.1, которое является вилкой Postgresql 8.4 и имеет те же функции окон. Обратите внимание, что Greenplum не может выполнять коррелированные подзапросы.
Ах, отлично! Это то, чем я был. Имеет смысл. Документы не так уж ясны. – EvilPuppetMaster
@erwinBrandsletter Сохранял мою жизнь! Спасибо – isJustMe