PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Somma tra le partizioni con le funzioni della finestra

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