Far*_*ani 1 sql postgresql self-join sql-update
我有这样一张桌子:
+------+-------+
|ID | value |
+------+-------+
| 1 | 150 |
| 2 | |
| 3 | |
| 4 | |
| 5 | 530 |
| 6 | 950 |
| 7 | 651 |
+-------+------+
Run Code Online (Sandbox Code Playgroud)
我想复制最后3个值,最后我的表格如下所示:
+------+-------+
|ID | value |
+------+-------+
| 1 | 150 |
| 2 | 530 |
| 3 | 950 |
| 4 | 651 |
| 5 | 530 |
| 6 | 950 |
| 7 | 651 |
+-------+------+
Run Code Online (Sandbox Code Playgroud)
可能吗?
使用自联接:
UPDATE mytable m
SET value = m0.value
FROM mytable m0
WHERE m.id = (m0.id - 3) -- define offset
AND m.id BETWEEN 2 AND 4 -- define range to be affected
AND m.value IS NULL; -- make sure only NULL values are updated
Run Code Online (Sandbox Code Playgroud)
如果ID空间中存在间隙,请使用windows函数row_number()
获取无间隙ID.我在CTE中这样做,因为我将重复使用该表两次以进行自联接:
WITH x AS (
SELECT *, row_number() OVER (ORDER BY ID) AS rn
FROM mytable
)
UPDATE mytable m
SET value = y.value
FROM x
JOIN x AS y ON x.rn = (y.rn - 4567) -- JOIN CTE x AS y with an offset
WHERE x.id = m.id -- JOIN CTE x to original
AND m.id BETWEEN 1235 AND 3455
AND m.value IS NULL;
Run Code Online (Sandbox Code Playgroud)
您需要PostgreSQL 9.1或更高版本来进行数据修改CTE.