我有一个包含 20 列的表,我想用该行(对于该列)的值减去同一列的前一行的值之间的差值来填充每一行的最后一列..(如果当前行的时间高于上一行的时间)
update tbl set column_with_differences =
(select case when (a.columnWithValueOnSameRow-b.columnWithValueOnPreviousRow) is null
then a.columnWithValueOnSameRow else a.columnWithValueOnSameRow-b.columnWithValueOnPreviousRow end
as tot
from tbl a left join
tbl b
on a.time > b.time);
具有值和时间的列是 varchar(10)。
我收到一个 MySQL 错误
ERROR 1093 (HY000): You can't specify target table 'tbl' for update in FROM clause
我知道出现此错误是正常的,因为我正在尝试在从中选择时更新表格。
有什么方法可以避免出现此错误并使用当前行减去上一行的差异实际更新表中的值?
非常感谢。
编辑:
糟糕,我忘了说我还有一个日期列,以及每一行的唯一 ID...
最佳答案
这有点复杂。在 select
查询中,您可以使用变量或执行以下操作来获取先前的值,
select tbl.*,
(select prev.col
from tbl prev
where prev.time < tbl.time
order by time desc
limit 1
) as prev_col
from tbl;
这假设 time
列是排序列。然后,您可以通过假设再次加入到此来进行更新——time
唯一标识每一行:
update tbl t join
(select tbl.*,
(select prev.col
from tbl prev
where prev.time < tbl.time
order by time desc
limit 1
) as prev_col
from tbl
) tt
on tt.time = t.time
set t.diff = t.col - tt.prev_col;
关于MySQL - 更新表并将列值设置为等于当前行值减去上一行值的差值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27362467/