Jag hittade det här svaret för SQL Server som också fungerar i Postgres. Efter att aldrig ha gjort det förut tyckte jag att tekniken var ganska smart. I grund och botten skapar han en anpassad partition för fönsterfunktionen genom att använda en case-sats inuti en kapslad fråga som ökar en summa när värdet inte är null och lämnar det ifred annars. Detta gör att man kan avgränsa varje nollsektion med samma nummer som det tidigare icke-nullvärdet. Här är frågan:
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
Och 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)