PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak używać funkcji okna SQL do obliczania procentu agregatu

Myślę, że tego szukasz:

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

Daje żądany wynik.

Funkcje okna są stosowane po funkcje agregujące. Zewnętrzna sum() w sum(sum(v)) OVER ... to funkcja okna (dołączona OVER ... klauzula) podczas gdy wewnętrzna sum() jest funkcją agregującą.

Skutecznie to samo co:

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;

Lub (bez 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;

Lub wariant @Mu.

Na marginesie:Greenplum wprowadził skorelowane podzapytania w wersji 4.2. Zobacz informacje o wydaniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać struktury danych pierścienia w funkcjach okien

  2. Wdrożenie klastra PostgreSQL Multi-Cloud Cluster

  3. Zresetuj sekwencję w jpa

  4. Wygeneruj n wierszy NULL w PostgreSQL

  5. Zmień pusty ciąg na NULL, gdy kolumna ma ograniczenie DATE