我有一个有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 - MySQL-更新表并将列值设置为等于当前行值减去前一行值的差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27362467/