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

标签 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...

最佳答案

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

相关文章:

mysql - 多个帐户的总和值

python - 为什么使用 set(int) 构建集合失败?

python - 无法设置 Pandas 数据框的索引 - 获取 "KeyError"

javascript - 如何将一组值添加到集合

mysql - 使用多个内部连接和顺序子句时 sql 查询速度极慢

Mysql ( Doctrine ) - 计算计数 > X 的内连接

mysql - 使用 select 语句插入 MySQL 表

php - mysql 查询波斯语和阿拉伯语字符的问题

javascript - 在 vuejs 中重新渲染之前调用问题函数

mysql 使用 UPDATE SET 和 TRIM(记录中的前导通配符前缀)更新数据库