我有一个有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/

10-15 15:53