sql >> Databasteknik >  >> RDS >> PostgreSQL

Summa över partitioner med fönsterfunktioner

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;

Ange först faktiska värden och följ NULL värden i en grupp med den aggregerade fönsterfunktionen count() :den ökar inte med NULL värden.

Ta sedan max() från varje grupp, kommer fram till det du letar efter. Vid det här laget kan du lika gärna använda min() eller sum() , eftersom det bara finns ett icke-nullvärde per grupp.

COALESCE() fångar NULL värden om det övergripande första värdet i tiden är NULL .

Notera hur jag valde ts som kolumnnamn, eftersom jag inte använder bastypnamn som time som identifierare.

Testfall

Det är också så ni alla ska tillhandahålla exempeldata i första hand!

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. Hur skickar jag ett []segment till ett IN-villkor i en förberedd SQL-sats med icke-IN-villkor också?

  2. hur man ändrar timeout för mysql beständiga anslutningar

  3. Hur man tar bort två dubbletter av kolumner

  4. använder sqlldr från java