使用同一个表中的值更新行

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)

可能吗?

Erw*_*ter 7

使用自联接:

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.