ウィンドウ関数で副問い合わせでSELECT文を作りその値でUPDATEする方法です。
PostgreSQLはIGNORE NULLSに対応してなかったようなので、
ありとなしで2パターン用意してあります。
負荷的には例に上がっている4件のデータで試しただけなので、
大量にデータがある場合に使えるかは何とも言えません。
またSAMPLE_TABLEはこちらで勝手に定義した仮のテーブル名です。
IGNORE NULLS使用
SQL
1UPDATE SAMPLE_TABLE S1
2SET (DATA1, DATA2) = (
3SELECT PREV_DATA1, PREV_DATA2
4FROM (
5 SELECT
6 SAMPLE_TABLE.*,
7 LAST_VALUE(DATA1 IGNORE NULLS) OVER(ORDER BY TIME_ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS PREV_DATA1,
8 LAST_VALUE(DATA2 IGNORE NULLS) OVER(ORDER BY TIME_ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS PREV_DATA2
9 FROM SAMPLE_TABLE
10 ) S2
11 WHERE S1.TIME_ID = S2.TIME_ID
12);
IGNORE NULLS不使用
SQL
1UPDATE SAMPLE_TABLE S1
2SET (DATA1, DATA2) = (
3SELECT PREV_DATA1, PREV_DATA2
4FROM (
5 SELECT
6 S.*,
7 FIRST_VALUE(DATA1) OVER (PARTITION BY GRP1) AS PREV_DATA1,
8 FIRST_VALUE(DATA2) OVER (PARTITION BY GRP2) AS PREV_DATA2
9 FROM (
10 SELECT
11 SAMPLE_TABLE.*,
12 SUM(CASE WHEN DATA1 IS NOT NULL THEN 1 END) OVER (ORDER BY TIME_ID) AS GRP1,
13 SUM(CASE WHEN DATA2 IS NOT NULL THEN 1 END) OVER (ORDER BY TIME_ID) AS GRP2
14 FROM SAMPLE_TABLE
15 ) S
16 ) S2
17 WHERE S1.TIME_ID = S2.TIME_ID
18);