Postgres に次のようなテーブルがあります。
# select * from p;
id | value
----+-------
1 | 100
2 |
3 |
4 |
5 |
6 |
7 |
8 | 200
9 |
(9 rows)
そして、次のようにクエリを実行したいと思います。
# select * from p;
id | value | new_value
----+-------+----------
1 | 100 |
2 | | 100
3 | | 100
4 | | 100
5 | | 100
6 | | 100
7 | | 100
8 | 200 | 100
9 | | 200
(9 rows)
選択のサブクエリでこれを既に実行できますが、実際のデータには20k以上の行があり、非常に遅くなります。
ウィンドウ関数でこれを行うことは可能ですか? lag() を使用したいのですが、IGNORE NULLSオプションをサポートしていないようです。
select id, value, lag(value, 1) over (order by id) as new_value from p;
id | value | new_value
----+-------+-----------
1 | 100 |
2 | | 100
3 | |
4 | |
5 | |
6 | |
7 | |
8 | 200 |
9 | | 200
(9 rows)