Ich habe diese Antwort für SQL Server gefunden, die auch in Postgres funktioniert. Da ich das noch nie zuvor gemacht hatte, fand ich die Technik ziemlich clever. Im Grunde erstellt er eine benutzerdefinierte Partition für die Windowing-Funktion, indem er eine case-Anweisung innerhalb einer verschachtelten Abfrage verwendet, die eine Summe erhöht, wenn der Wert nicht null ist, und sie ansonsten in Ruhe lässt. Dadurch kann jeder Nullabschnitt mit der gleichen Nummer wie der vorherige Nicht-Nullwert abgegrenzt werden. Hier ist die Abfrage:
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
Und die Ergebnisse:
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)