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