sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man använder en SQL-fönsterfunktion för att beräkna en procentandel av ett aggregat

Jag tror att du letar efter detta:

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

Ger det begärda resultatet.

Fönsterfunktioner tillämpas efter samla funktioner. Den yttre sum() i sum(sum(v)) OVER ... är en fönsterfunktion (bifogad OVER ... sats) medan den inre sum() är en aggregerad funktion.

I praktiken samma sak 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 (utan 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 @Mus variant.

Bortsett från:Greenplum introducerade korrelerade underfrågor med version 4.2. Se release notes.



  1. Varför finns det mycket variation i MySQL (InnoDB) prestanda?

  2. Konvertera tidsstämpel till ett läsbart datum under förfrågan

  3. Dependent dropdown box CakePHP 3

  4. Hur NVL() fungerar i MariaDB