PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Soma entre partições com funções de janela

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