Ik vond dit antwoord voor SQL Server die ook in Postgres werkt. Omdat ik het nog nooit eerder had gedaan, vond ik de techniek best slim. Kortom, hij maakt een aangepaste partitie voor de vensterfunctie door een case-instructie te gebruiken in een geneste query die een som verhoogt wanneer de waarde niet null is en deze anders met rust laat. Hierdoor kan men elke null-sectie afbakenen met hetzelfde nummer als de vorige niet-null-waarde. Dit is de vraag:
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
En de resultaten:
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)