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;
Per prima cosa, inserisci i valori effettivi e segui NULL
valori in un gruppo con la funzione di aggregazione della finestra count()
:non incrementa con NULL
valori.
Quindi prendi max()
da ogni gruppo, arrivando a quello che cerchi. A questo punto potresti anche usare min()
o sum()
, poiché esiste un solo valore non nullo per gruppo.
COALESCE()
rileva NULL
valori se il primo valore complessivo nel tempo è NULL
.
Nota come ho scelto ts
come nome di colonna, poiché non utilizzo nomi di tipo base come time
come identificatori.
Caso di prova
Questo è anche il modo in cui tutti voi dovreste fornire dati di esempio in primo luogo!
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);