Ho bisogno di calcolare le percentuali di varie dimensioni in una tabella. Mi piacerebbe semplificare le cose usando le funzioni della finestra per calcolare il denominatore, tuttavia ho un problema perché il numeratore deve essere anche un aggregato.Come utilizzare una funzione della finestra SQL per calcolare una percentuale di un aggregato
Come semplice esempio, prendere la seguente tabella:
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);
Se voglio solo per calcolare la quota di ogni singola riga di d1, funzioni poi windowing funzionano bene:
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
Tuttavia, ciò che devo fare è calcolare la quota complessiva per la somma di d2 su d1. L'uscita sto cercando è questo:
"b";"x";1.00
"a";"x";0.25
"a";"y";0.75
Così provo questo:
select d1, d2, sum(v)/sum(v) over (partition by d1)
from test
group by d1, d2;
Tuttavia, ora ottengo un errore:
ERROR: column "test.v" must appear in the GROUP BY clause or be used in an aggregate function
Sto assumendo questo è perché si lamenta che la funzione finestra non è considerata nella clausola di raggruppamento, tuttavia le funzioni di windowing non possono essere inserite nella clausola di raggruppamento.
Questo sta utilizzando Greenplum 4.1, che è un fork di Postgresql 8.4 e condivide le stesse funzioni di windowing. Si noti che Greenplum non può eseguire sottoquery correlate.
Ah fantastico! Questo è quello che stavo cercando. Ha senso. I documenti non sono così chiari su questa roba. – EvilPuppetMaster
@erwinBrandsletter Salvato la mia vita! grazie – isJustMe