MySQL-更新表并将列值设置为当前行值减去上一行值的差值

MySQL-更新表并将列值设置为当前行值减去上一行值的差值,mysql,set,Mysql,Set,我有一个包含20列的表,我想用此行(此列)的值减去同一列上一行的值之差填充每行的最后一列。。(如果当前行上的时间高于上一行上的时间) 包含值和时间的列是varchar(10) 我得到一个MySQL错误 ERROR 1093 (HY000): You can't specify target table 'tbl' for update in FROM clause 我知道出现此错误是正常的,因为我试图在从表中进行选择时更新表 有没有办法避免出现这个错误,并用当前行减去前一行的差值来更新表中的值

我有一个包含20列的表,我想用此行(此列)的值减去同一列上一行的值之差填充每行的最后一列。。(如果当前行上的时间高于上一行上的时间)

包含值和时间的列是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;

注意:MySQL不包含行顺序的固有概念。没有ORDERBY子句的SELECT查询可以任意顺序返回结果集中的行。因此,如果要将“上一行”标识为任何行,则需要从排序开始。如果你使用“默认顺序”,无论发生什么,当你的桌子变大时,你都会感到抱歉。嗨,戈登,谢谢你的回答。我忘了提到每一行都有一个日期和一个唯一的ID,所以这一行可以有相同的时间,但它们将有不同的日期。。也许这可以帮助你解决你的问题,很抱歉在我的第一篇文章中没有提到。
select tbl.*,
       (select prev.col
        from tbl prev
        where prev.time < tbl.time
        order by time desc
        limit 1
       ) as prev_col
from tbl;
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;