PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Сумиране на дялове с прозоречни функции

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;

Първо, поставете действителните стойности и следвайте NULL стойности в група с функцията за обобщен прозорец count() :не се увеличава с NULL стойности.

След това вземете max() от всяка група, достигайки до това, което търсите. На този етап можете също така да използвате min() или sum() , тъй като има само една ненулева стойност на група.

COALESCE() улавя NULL стойности, ако общата първа стойност във времето е NULL .

Обърнете внимание как избрах ts като име на колона, тъй като не използвам имена на основен тип като time като идентификатори.

Тестов случай

Това е и начинът, по който всеки трябва да предостави примерни данни на първо място!

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. Поточно предаване на данни от Postgres в Python

  2. Добавете колона за автоматично нарастване към съществуваща таблица, подредена по дата

  3. Как да работя с PGpoint за геолокация, използвайки PostgreSQL?

  4. Как да добавя нова колона в таблица след 2-ра или 3-та колона в таблицата с помощта на postgres?

  5. PostgreSQL - не можа да идентифицира оператор за равенство за тип json