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;
Първо, поставете действителните стойности и следвайте NULL
стойности в група с функцията за обобщен прозорец count()
:не се увеличава с NULL
стойности.
След това вземете max()
от всяка група, достигайки до това, което търсите. На този етап можете също така да използвате min()
или sum()
, тъй като има само една ненулева стойност на група.
COALESCE()
улавя NULL
стойности, ако общата първа стойност във времето е NULL
.
Обърнете внимание как избрах ts
като име на колона, тъй като не използвам имена на основен тип като time
като идентификатори.
Тестов случай
Това е и начинът, по който всеки трябва да предостави примерни данни на първо място!
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);