sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo usar una función de ventana SQL para calcular un porcentaje de un agregado

Creo que estás buscando esto:

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

Produce el resultado solicitado.

Las funciones de ventana se aplican después Funciones agregadas. El exterior sum() en sum(sum(v)) OVER ... es una función de ventana (adjunto OVER ... cláusula) mientras que el sum() interno es una función agregada.

Efectivamente lo mismo 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;

O (sin 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 de @Mu.

Aparte:Greenplum introdujo subconsultas correlacionadas con la versión 4.2. Consulte las notas de la versión