PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Sumuj na partycjach z funkcjami okna

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;

Najpierw umieść rzeczywiste wartości, a następnie NULL wartości w grupie z funkcją agregacji okna count() :nie zwiększa się o NULL wartości.

Następnie weź max() z każdej grupy, docierając do tego, czego szukasz. W tym momencie możesz równie dobrze użyć min() lub sum() , ponieważ na grupę przypada tylko jedna wartość niepusta.

COALESCE() łapie NULL wartości, jeśli ogólna pierwsza wartość w czasie to NULL .

Zwróć uwagę, jak wybrałem ts jako nazwę kolumny, ponieważ nie używam nazw typów podstawowych, takich jak time jako identyfikatory.

Przypadek testowy

W ten sposób wszyscy powinniście przede wszystkim dostarczać przykładowe dane!

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz zapytanie tylko z kolumnami, które mają wszystkie wartości w klauzuli `in`

  2. Zakleszczenia Postgresa na jednoczesnych upserts

  3. Jak mogę wysłać e-mail z wyzwalacza PostgreSQL?

  4. różnice w sortowaniu postgres. osx v ubuntu

  5. Jak zmodyfikować pojedynczą wartość właściwości w typie danych PostgreSQL JSONB?