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

Sådan bruger du en SQL-vinduefunktion til at beregne en procentdel af et aggregat

Jeg tror, ​​du leder efter dette:

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

Frembringer det ønskede resultat.

Vinduesfunktioner anvendes efter aggregerede funktioner. Den ydre sum() i sum(sum(v)) OVER ... er en vinduesfunktion (vedhæftet OVER ... klausul), mens den indre sum() er en aggregeret funktion.

Faktisk det samme som:

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;

Eller (uden 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;
 

Eller @Mu's variant.

Til side:Greenplum introducerede korrelerede underforespørgsler med version 4.2. Se udgivelsesbemærkninger.



  1. Skift brugeradgangskode via jdbc. Problemer med afleveringer med spørgsmålstegn

  2. F# fejl 'fejl FS0039:Navnerummet eller modulet 'MySql' er ikke defineret'?

  3. hvordan kan vi ændre værdien ved at bruge radioknapper

  4. Unikke IP'er i et afstemningssystem