更新当前行与上一行之间的差异行

时间:2013-07-03 13:09:52

标签: mysql

我在获取delta值时面临一些困难:

id  value  delta
1   929     928
2   947     18
3   950     21
4   952     23

Delta 列应使用同一个表中连续行的之间的差异进行更新。

我是说,     第二行Delta值应为[947 - 929]=18     在第三行Delta值应为[950 - 947]=3     在第四行中,Delta值应为[952 - 950]=2等。

默认 929 总是第二个参数。这就是它产生问题的原因。 我使用了以下查询。这有什么问题吗?

update table_name tt1 left outer JOIN table_name tt2 ON  tt1.value>tt2.value set
tt1.delta = (tt1.value-tt2.value);

5 个答案:

答案 0 :(得分:0)

当您进行多个表更新时(即使这是同一个表,因为您使用它作为参考它是一个多表更新),您通常不会执行JOIN子句(根据此处的mysql文档: http://dev.mysql.com/doc/refman/5.0/en/update.html)。

您可以这样做:

UPDATE table_name tt1, table_name tt2
SET tt1.delta = (tt1.value - tt2.value)
WHERE
tt2.id = (tt1.id + 1) 

一个好的调试技术是将UPDATE更改为SELECT并验证delta字段是否是您想要的:

SELECT tt1.*,  (tt1.value - tt2.value) AS delta
FROM  table_name tt1, table_name tt2
WHERE
tt2.id = (tt1.id + 1) 

答案 1 :(得分:0)

假设id确实是增量的(没有间隙)

SELECT x.*
     , y.value-x.value delta
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.id = x.id + 1;

...并考虑存储可以从其他值轻松获得的值是否真的有任何优点。

答案 2 :(得分:0)

Update T1
SET T1.delta = Ta.value - T1.value
FROM T1
INNER JOIN T1 Ta ON T1.id + 1 = Ta.id

答案 3 :(得分:0)

尝试此查询。

UPDATE TABLE_NAME T
SET T.DELTA = (T.VALUE - (SELECT VALUE FROM TABLE_NAME WHERE ID = T.ID - 1))
WHERE T.ID > 1;

如果您的表具有从2开始的每个ID的记录,则此查询应该有效。

此查询不会更新第一条记录。

答案 4 :(得分:0)

update t t1  
set delta=value-coalesce((select value from 
                    (select id,value from t) t2 
                    where t2.id<t1.id 
                    order by t2.id desc limit 1),1)

SQL filddle demo

相关问题