2013-07-14 109 views
0

我一直在做這方面的一些研究,並且感謝在另一個主題上發佈的解決方案,我接近解決了這個問題。用SQL計算差異

我試圖獲得在一列數據的變化:行(N) - 行(N-1)

update Table tt1 
left outer JOIN Table tt2 
on tt1.name = tt2.name 
and tt1.date-tt2.date=1 
set tt1.delta = (tt1.amount-ifnull(tt2.amount, tt1.amount)); 

輸出是

Date  | Value | Delta 
2013-03-30| 38651 | 393 
2013-03-31| 39035 | 384 
2013-04-01| 39459 | 0 
2013-04-02| 39806 | 347 

正如你所看到的,差值不計算在4月的第一個月(其餘的值都很好)。每個月的第一天也是如此。

我的猜測是[和tt1.date-tt2.date = 1]有關係,但我無法弄清楚究竟是什麼。

感謝您提前提供的所有幫助!

回答

0

我做了一些修改,以你的說法...你的錯誤或者是你處理日期的方式,你處理的方式德爾塔...

update Table tt1 
left outer JOIN Table tt2 
on tt1.name = tt2.name 
and tt1.date = date_sub(tt2.date, interval 1 day)  
set tt1.delta = case when tt2.amount is not null then tt1.amount - tt2.amount else -1 end; 
+1

謝謝你的解決方案。它工作正常,我只需要添加一個'。'到tt2.amount以避免語法錯誤,並將減法更改爲tt2.amount - tt1.amount。 – user2581135

+0

謝謝,我解決了答案 –

0

嘗試DATEDIFF這會給你兩天之間的差異。

and DATEDIFF(tt1.date,tt2.date) =1 

這一點,因爲你是differenting 01-31和這不是真的這就是爲什麼你會得到0

所以你應該每月還百米運動員。

0

一個猜測是日期不存儲爲date,而是有一個時間組件。您可以通過轉換爲date使用date()或使用datediff()解決這個問題:

update Table tt1 left outer JOIN 
     Table tt2 
     on tt1.name = tt2.name and datediff(tt1.date, tt2.date) = 1 
    set tt1.delta = (tt1.amount-ifnull(tt2.amount, tt1.amount)); 
+0

感謝您的回答。我測試了這個查詢並且可以確認它是完美的。 – user2581135