PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como usar uma função de janela SQL para calcular uma porcentagem de um agregado


Acho que você está procurando por isso:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM   test
GROUP  BY d1, d2;

Produz o resultado solicitado.

As funções da janela são aplicadas depois funções agregadas. A sum() externa em sum(sum(v)) OVER ... é uma função de janela (anexa OVER ... cláusula) enquanto a sum() interna é uma função agregada.

Efetivamente o mesmo que:
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;

Ou (sem 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;

Ou a variante de @Mu.

À parte:Greenplum introduziu subconsultas correlacionadas com a versão 4.2. Consulte as notas da versão.