Tôi có một bảng trong Postgres trông như thế này:Làm cách nào để chọn hiệu quả giá trị không null trước đó?
# select * from p;
id | value
----+-------
1 | 100
2 |
3 |
4 |
5 |
6 |
7 |
8 | 200
9 |
(9 rows)
Và tôi muốn truy vấn để làm cho nó trông như thế này:
# select * from p;
id | value | new_value
----+-------+----------
1 | 100 |
2 | | 100
3 | | 100
4 | | 100
5 | | 100
6 | | 100
7 | | 100
8 | 200 | 100
9 | | 200
(9 rows)
tôi đã có thể làm điều này với một subquery trong lựa chọn, nhưng trong dữ liệu thực tế của tôi, tôi có 20k hàng trở lên và nó được khá chậm.
Điều này có thể thực hiện được trong chức năng cửa sổ không? Tôi rất thích sử dụng lag(), nhưng nó dường như không hỗ trợ tùy chọn IGNORE NULLS.
select id, value, lag(value, 1) over (order by id) as new_value from p;
id | value | new_value
----+-------+-----------
1 | 100 |
2 | | 100
3 | |
4 | |
5 | |
6 | |
7 | |
8 | 200 |
9 | | 200
(9 rows)
+1 ... Đây là giải pháp thực sự thông minh, cũng là chỉ mục trên 'id' và' value' sẽ cải thiện hiệu suất. – MatheusOl
Giải pháp tuyệt vời cho tôi trong năm 2015! – Chris
bạn có thể sử dụng 'count (value)' thay vì 'sum (case ...)' như đếm bỏ qua null. – shaunc