sql >> Database >  >> RDS >> PostgreSQL

Optellen over partities met vensterfuncties

SELECT ts, a, b, c
       , COALESCE(max(a) OVER (PARTITION BY grp_a), 0)
       + COALESCE(max(b) OVER (PARTITION BY grp_b), 0)
       + COALESCE(max(c) OVER (PARTITION BY grp_c), 0) AS special_sum
FROM  (
   SELECT *
         ,count(a) OVER w AS grp_a
         ,count(b) OVER w AS grp_b
         ,count(c) OVER w AS grp_c
   FROM   t
   WINDOW w AS (ORDER BY ts)
   ) sub
ORDER  BY ts;

Voer eerst de werkelijke waarden in en volg NULL waarden in een groep met de aggregatievensterfunctie count() :het wordt niet verhoogd met NULL waarden.

Neem dan max() van elke groep, komend tot wat u zoekt. Op dit punt kun je net zo goed min() . gebruiken of sum() , aangezien er slechts één niet-null-waarde per groep is.

COALESCE() vangt NULL waarden als de algemene eerste waarde in de tijd NULL is .

Merk op hoe ik ts heb gekozen als kolomnaam, aangezien ik geen namen van het basistype gebruik zoals time als identifiers.

Testcase

Dat is ook hoe u in de eerste plaats voorbeeldgegevens zou moeten verstrekken!

CREATE TEMP TABLE t (ts int, a int, b int, c int);

INSERT INTO t VALUES
  (1, 11,   21,   NULL)
 ,(2, 12,   22,   NULL)
 ,(3, 13,   NULL, NULL)
 ,(4, NULL, 23,   32);



  1. Functiedefinities uitsluiten bij het dumpen van een PostgreSQL-database

  2. Probleem met voorbereide verklaring

  3. Hoe toegang te krijgen tot de gegevens / gegevensmap op een Android-apparaat?

  4. Vind het kleinste ongebruikte nummer in SQL Server