sql >> Databáze >  >> RDS >> PostgreSQL

Součet napříč oddíly s funkcemi 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;

Nejprve vložte skutečné hodnoty a následující NULL hodnoty ve skupině s agregační funkcí okna count() :nezvyšuje se pomocí NULL hodnoty.

Pak vezměte max() z každé skupiny dorazí k tomu, co hledáte. V tomto okamžiku můžete stejně dobře použít min() nebo sum() , protože existuje pouze jedna nenulová hodnota na skupinu.

COALESCE() zachytí NULL hodnoty, pokud je celková první hodnota v čase NULL .

Všimněte si, jak jsem vybral ts jako název sloupce, protože nepoužívám názvy základních typů jako time jako identifikátory.

Testovací případ

To je také způsob, jakým byste měli na prvním místě poskytnout vzorová data!

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. Jak získat podřetězec z tabulky SQL?

  2. Jak nainstalovat Apache Cassandra na Ubuntu 20.10/Ubuntu 20.04

  3. Vytahování obrazových dat BLOB z MySQL v PHP

  4. Co dělat (nebo nedělat) s hlavními statistikami čekání