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;
Primeiro, coloque os valores reais e seguindo
NULL
valores em um grupo com a função de janela agregada count()
:não incrementa com NULL
valores. Então pegue
max()
de cada grupo, chegando ao que você está procurando. Neste ponto, você também pode usar min()
ou sum()
, pois há apenas um valor não nulo por grupo. COALESCE()
pega NULL
valores se o primeiro valor geral no tempo for NULL
. Observe como eu escolhi
ts
como nome da coluna, já que não uso nomes de tipo base como time
como identificadores. Caso de teste
É também assim que todos vocês devem fornecer dados de amostra em primeiro lugar!
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);