Ho trovato questa risposta per SQL Server che funziona anche in Postgres. Non avendolo mai fatto prima, ho pensato che la tecnica fosse abbastanza intelligente. Fondamentalmente, crea una partizione personalizzata per la funzione di windowing utilizzando un'istruzione case all'interno di una query nidificata che incrementa una somma quando il valore non è null e lo lascia da solo altrimenti. Ciò consente di delineare ogni sezione nulla con lo stesso numero del precedente valore non nullo. Ecco la domanda:
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
E i risultati:
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)