2013-07-03 44 views
1

我面臨一些困難,以獲得增量值之間的差異:更新行與當前行和前一行

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

三角洲欄應該從連續行的之間的差異更新同一張桌子。

我的意思是, 在第二行增量值應該是[947 - 929]=18 在第三排德爾塔值應爲[950 - 947]=3 在第四行增量值應爲[952 - 950]=2

默認始終是第二個參數。這就是它造成問題的原因。 我用了下面的查詢。是否有這個問題?

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

再次編輯你的問題......看起來有些怪異格式 – srahul07

回答

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和驗證增量領域是你想要什麼:

SELECT tt1.*, (tt1.value - tt2.value) AS delta 
FROM table_name tt1, table_name tt2 
WHERE 
tt2.id = (tt1.id + 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; 

...並考慮是否真的有有利於存儲可輕易從其他值導出的值。

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

試試此查詢。

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

,如果你的表對於每一個ID從2

開始這個查詢將不會更新第一記錄的記錄此查詢應該工作。

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