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;
Đầu tiên, hãy đặt các giá trị thực và theo sau NULL
các giá trị trong một nhóm với hàm cửa sổ tổng hợp count()
:nó không tăng với NULL
giá trị.
Sau đó lấy max()
từ mọi nhóm, đến những gì bạn đang tìm kiếm. Tại thời điểm này, bạn cũng có thể sử dụng min()
hoặc sum()
, vì mỗi nhóm chỉ có một giá trị không rỗng.
COALESCE()
bắt NULL
giá trị nếu giá trị tổng thể đầu tiên trong thời gian là NULL
.
Lưu ý cách tôi chọn ts
làm tên cột, vì tôi không sử dụng tên loại cơ sở như time
dưới dạng số nhận dạng.
Trường hợp thử nghiệm
Đó cũng là cách mà mọi người nên cung cấp dữ liệu mẫu ngay từ đầu!
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);