PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Jumlahkan seluruh partisi dengan fungsi jendela

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;

Pertama, masukkan nilai aktual dan ikuti NULL nilai dalam grup dengan fungsi jendela agregat count() :tidak bertambah dengan NULL nilai.

Kemudian ambil max() dari setiap kelompok, sampai pada apa yang Anda cari. Pada titik ini Anda juga bisa menggunakan min() atau sum() , karena hanya ada satu nilai bukan nol per grup.

COALESCE() menangkap NULL nilai jika keseluruhan nilai pertama dalam waktu adalah NULL .

Perhatikan bagaimana saya memilih ts sebagai nama kolom, karena saya tidak menggunakan nama tipe dasar seperti time sebagai pengenal.

Kasus uji

Itu juga bagaimana Anda semua orang harus memberikan data sampel di tempat pertama!

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:dapatkan min, max, nilai agregat dalam satu pilihan

  2. Simpan output dari fungsi sql ke file csv (COPY) dengan nama file dinamis

  3. Pustaka tidak dimuat:/usr/local/opt/readline/lib/libreadline.6.2.dylib

  4. Postgis / Geodjango:Tidak dapat menentukan versi PostGIS untuk database

  5. Pengantar PostgreSQL