sql >> Base de Datos >  >> RDS >> PostgreSQL

Suma a través de particiones con funciones de ventana

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