Saya menemukan jawaban ini untuk SQL Server yang juga berfungsi di Postgres. Karena belum pernah melakukannya sebelumnya, saya pikir tekniknya cukup pintar. Pada dasarnya, ia membuat partisi khusus untuk fungsi windowing dengan menggunakan pernyataan kasus di dalam kueri bersarang yang menambah jumlah ketika nilainya bukan nol dan membiarkannya sendiri sebaliknya. Ini memungkinkan seseorang untuk menggambarkan setiap bagian nol dengan nomor yang sama dengan nilai bukan nol sebelumnya. Berikut pertanyaannya:
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
Dan hasilnya:
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)