Postgresでも機能するSQLServerのこの答えを見つけました。これまでやったことがないので、テクニックはかなり賢いと思いました。基本的に、彼は、ネストされたクエリ内でcaseステートメントを使用して、ウィンドウ関数のカスタムパーティションを作成します。このステートメントは、値がnullでない場合は合計をインクリメントし、それ以外の場合はそのままにします。これにより、すべてのnullセクションを前のnull以外の値と同じ番号で描くことができます。クエリは次のとおりです:
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
そして結果:
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)