PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment utiliser une fonction de fenêtre SQL pour calculer un pourcentage d'un agrégat

Je pense que vous cherchez ceci :

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

Produit le résultat demandé.

Les fonctions de fenêtre sont appliquées après fonctions d'agrégation. Le sum() externe dans sum(sum(v)) OVER ... est une fonction de fenêtre (joint OVER ... clause) tandis que le sum() intérieur est une fonction d'agrégation.

Effectivement identique à :

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 (sans 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 la variante de @Mu.

A part :Greenplum a introduit des sous-requêtes corrélées avec la version 4.2. Voir les notes de version.