J'ai trouvé cette réponse pour SQL Server qui fonctionne également dans Postgres. N'ayant jamais fait cela auparavant, je pensais que la technique était assez astucieuse. Fondamentalement, il crée une partition personnalisée pour la fonction de fenêtrage en utilisant une instruction case à l'intérieur d'une requête imbriquée qui incrémente une somme lorsque la valeur n'est pas nulle et la laisse seule sinon. Cela permet de délimiter chaque section nulle avec le même numéro que la valeur non nulle précédente. Voici la requête :
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
Et les résultats :
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)