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;
Nejprve vložte skutečné hodnoty a následující NULL hodnoty ve skupině s agregační funkcí okna count() :nezvyšuje se pomocí NULL hodnoty.
Pak vezměte max() z každé skupiny dorazí k tomu, co hledáte. V tomto okamžiku můžete stejně dobře použít min() nebo sum() , protože existuje pouze jedna nenulová hodnota na skupinu.
COALESCE() zachytí NULL hodnoty, pokud je celková první hodnota v čase NULL .
Všimněte si, jak jsem vybral ts jako název sloupce, protože nepoužívám názvy základních typů jako time jako identifikátory.
Testovací případ
To je také způsob, jakým byste měli na prvním místě poskytnout vzorová data!
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);