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

Sum på tværs af partitioner med vinduesfunktioner

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;

Indsæt først faktiske værdier og følg NULL værdier i en gruppe med den samlede vinduesfunktion count() :den stiger ikke med NULL værdier.

Tag derefter max() fra hver gruppe, ankommer til det, du leder efter. På dette tidspunkt kunne du lige så godt bruge min() eller sum() , da der kun er én ikke-nul værdi pr. gruppe.

COALESCE() fanger NULL værdier, hvis den overordnede første værdi i tid er NULL .

Bemærk, hvordan jeg valgte ts som kolonnenavn, da jeg ikke bruger basistypenavne som time som identifikatorer.

Testcase

Det er også sådan, du alle bør give eksempeldata i første omgang!

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. XOR Constraint i Mysql

  2. Brug mysqldump til at sikkerhedskopiere MySQL eller MariaDB

  3. Ved hjælp af Pentaho Kettle, hvordan indlæser jeg flere borde fra en enkelt tabel, mens jeg bevarer referenceintegriteten?

  4. Sådan eksporteres data fra Excel-regneark til SQL Server 2008-tabel