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