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