PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come utilizzare una funzione finestra SQL per calcolare una percentuale di un aggregato

Penso che tu stia cercando questo:

SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM   test
GROUP  BY d1, d2;

Produce il risultato richiesto.

Le funzioni della finestra vengono applicate dopo funzioni aggregate. Il sum() esterno in sum(sum(v)) OVER ... è una funzione della finestra (allegata OVER ... clausola) mentre il sum() interno è una funzione aggregata.

Effettivamente lo stesso di:

WITH x AS (
   SELECT d1, d2, sum(v) AS sv
   FROM   test
   GROUP  BY d1, d2
   )
SELECT d1, d2, sv/sum(sv) OVER (PARTITION BY d1) AS share
FROM   x;

Oppure (senza CTE):

SELECT d1, d2, sv/sum(sv) OVER (PARTITION BY d1) AS share
FROM  (
   SELECT d1, d2, sum(v) AS sv
   FROM   test
   GROUP  BY d1, d2
   ) x;

O la variante di @Mu.

A parte:Greenplum ha introdotto sottoquery correlate con la versione 4.2. Vedi le note sulla versione.