我在获取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);
答案 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)