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;
Primero, coloque los valores reales y siga NULL
valores en un grupo con la función de ventana agregada count()
:no se incrementa con NULL
valores.
Luego toma max()
de cada grupo, llegando a lo que buscas. En este punto, también podría usar min()
o sum()
, ya que solo hay un valor no nulo por grupo.
COALESCE()
captura NULL
valores si el primer valor general en el tiempo es NULL
.
Tenga en cuenta cómo elegí ts
como nombre de columna, ya que no uso nombres de tipo base como time
como identificadores.
Caso de prueba
¡Así es como todos deberían proporcionar datos de muestra en primer 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);