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;
Najpierw umieść rzeczywiste wartości, a następnie NULL
wartości w grupie z funkcją agregacji okna count()
:nie zwiększa się o NULL
wartości.
Następnie weź max()
z każdej grupy, docierając do tego, czego szukasz. W tym momencie możesz równie dobrze użyć min()
lub sum()
, ponieważ na grupę przypada tylko jedna wartość niepusta.
COALESCE()
łapie NULL
wartości, jeśli ogólna pierwsza wartość w czasie to NULL
.
Zwróć uwagę, jak wybrałem ts
jako nazwę kolumny, ponieważ nie używam nazw typów podstawowych, takich jak time
jako identyfikatory.
Przypadek testowy
W ten sposób wszyscy powinniście przede wszystkim dostarczać przykładowe dane!
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);