Tôi giả sử một cột bổ sung col0
chứa tiêu chí sắp xếp rõ ràng cho dữ liệu của bạn, như col1
của bạn dữ liệu mẫu không thực sự được sắp xếp chính xác (các giá trị lặp lại, theo sau của A
và E
).
Tôi thích MODEL
điều khoản cho các loại mục đích này. Truy vấn sau đây mang lại kết quả mong đợi:
WITH t(col0, col1, col2, col3, col4) AS (
SELECT 1, 'A', 0, 1, 5 FROM DUAL UNION ALL
SELECT 2, 'B', 0, 4, 0 FROM DUAL UNION ALL
SELECT 3, 'C', 2, 0, 0 FROM DUAL UNION ALL
SELECT 4, 'D', 0, 0, 0 FROM DUAL UNION ALL
SELECT 5, 'E', 3, 5, 0 FROM DUAL UNION ALL
SELECT 6, 'F', 0, 3, 0 FROM DUAL UNION ALL
SELECT 7, 'G', 0, 3, 1 FROM DUAL UNION ALL
SELECT 8, 'A', 0, 1, 5 FROM DUAL UNION ALL
SELECT 9, 'E', 3, 5, 0 FROM DUAL
)
SELECT * FROM t
MODEL
DIMENSION BY (row_number() OVER (ORDER BY col0) rn)
MEASURES (col1, col2, col3, col4)
RULES (
col2[any] = DECODE(col2[cv(rn)], 0, NVL(col2[cv(rn) - 1], 0), col2[cv(rn)]),
col3[any] = DECODE(col3[cv(rn)], 0, NVL(col3[cv(rn) - 1], 0), col3[cv(rn)]),
col4[any] = DECODE(col4[cv(rn)], 0, NVL(col4[cv(rn) - 1], 0), col4[cv(rn)])
)
Kết quả:
RN COL1 COL2 COL3 COL4
1 A 0 1 5
2 B 0 4 5
3 C 2 4 5
4 D 2 4 5
5 E 3 5 5
6 F 3 3 5
7 G 3 3 1
8 A 3 1 5
9 E 3 5 5
Lưu ý về mệnh đề MODEL so với phương pháp tiếp cận dựa trên hàm cửa sổ
Mặc dù phần trên trông có vẻ thú vị (hoặc đáng sợ, tùy thuộc vào quan điểm của bạn), bạn chắc chắn nên thích sử dụng chức năng đánh giá dựa trên hàm cửa sổ như được hiển thị bởi các câu trả lời thanh lịch khác bởi nop77svk (sử dụng LAST_VALUE() IGNORE NULLS
)
hoặc MT0 (sử dụng LAG() IGNORE NULLS
)
. Tôi đã giải thích những câu trả lời này chi tiết hơn trong bài đăng trên blog này
.