MySQL - 更新表并设置列值等于当前行值减去前一行值的不同

时间:2014-12-08 16:32:46

标签: mysql set

我有一个包含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 ......

1 个答案:

答案 0 :(得分:1)

这有点复杂。在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;