1

我在获取 delta 值时遇到了一些困难:

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

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

我的意思是,在第二行 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);
4

5 回答 5

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) 
于 2013-07-03T13:18:57.797 回答
0

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

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

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

于 2013-07-03T13:19:37.497 回答
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 字段演示

于 2013-07-03T13:41:56.430 回答
0
Update T1
SET T1.delta = Ta.value - T1.value
FROM T1
INNER JOIN T1 Ta ON T1.id + 1 = Ta.id
于 2013-07-03T13:20:34.973 回答
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 都有记录,则此查询应该有效。

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

于 2013-07-03T13:20:48.003 回答