Tôi đã tìm thấy câu trả lời này cho SQL Server cũng hoạt động trong Postgres. Chưa bao giờ làm điều đó trước đây, tôi nghĩ rằng kỹ thuật này khá thông minh. Về cơ bản, anh ta tạo một phân vùng tùy chỉnh cho hàm cửa sổ bằng cách sử dụng một câu lệnh trường hợp bên trong một truy vấn lồng nhau để tăng tổng khi giá trị không phải là null và để nguyên nó. Điều này cho phép người ta phân định mọi phần rỗng với cùng một số với giá trị không rỗng trước đó. Đây là truy vấn:
SELECT
id, value, value_partition, first_value(value) over (partition by value_partition order by id)
FROM (
SELECT
id,
value,
sum(case when value is null then 0 else 1 end) over (order by id) as value_partition
FROM p
ORDER BY id ASC
) as q
Và kết quả:
id | value | value_partition | first_value
----+-------+-----------------+-------------
1 | 100 | 1 | 100
2 | | 1 | 100
3 | | 1 | 100
4 | | 1 | 100
5 | | 1 | 100
6 | | 1 | 100
7 | | 1 | 100
8 | 200 | 2 | 200
9 | | 2 | 200
(9 rows)