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