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);