sql >> Database >  >> RDS >> PostgreSQL

Een SQL-vensterfunctie gebruiken om een ​​percentage van een aggregaat te berekenen

Ik denk dat je dit zoekt:

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

Produceert het gevraagde resultaat.

Vensterfuncties worden na . toegepast geaggregeerde functies. De buitenste sum() in sum(sum(v)) OVER ... is een vensterfunctie (bijgevoegd OVER ... clausule) terwijl de binnenste sum() is een geaggregeerde functie.

In feite hetzelfde als:

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;

Of (zonder 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;

Of de variant van @Mu.

Terzijde:Greenplum introduceerde gecorreleerde subquery's met versie 4.2. Zie release-opmerkingen.



  1. Hoe bewaar ik MySQL-configuratievariabelen in CloudSQL?

  2. Type komt niet overeen:kan niet converteren van java.util.Date naar java.sql.Date

  3. Een JSON-element opvragen

  4. Hoe kan ik minder dan, groter dan in JSON Postgres-velden doen?