2013-10-03 70 views
0

我正在創建一個臨時表,它目前爲今天和昨天提供值。臨時表看起來像這樣:MySQL - 從第1行中減去第2行,其中列是相同的

|DateTime    |company 1 |company 2 | 
+------------------------+----------------------+ 
|2013-10-03 14:40:00  | 182475 | 110271 | 
|2013-10-02 14:10:00  | 182086 | 110261 | 

我需要做的是從今天選擇值,以及今天和昨天之間的差異。基於上述數據,輸出應該是這樣的:

Company 1 | Company 1 difference | Company 2| Company 2 difference 
+-----------+----------------------+----------+-------------------------- 
182475  |   389   | 110271 |   10 

我無法弄清楚如何指定減去哪一行從哪個,因爲沒有自動遞增字段和日期時間字段會每天略有不同。

感謝您的幫助!

+0

這是一個奇怪的結構,讓每個公司作爲一個單獨的列而不是例如'(Date,CompanyNumber,Amount)'。無論如何,這些金額是否嚴格按照時間增加,這樣就可以簡單地使用MAX() - MIN()'? – eggyal

回答

1
SELECT today.DateTime as DateTime 
    , today.Company1, today.Company1 - COALESCE(yesterday.Company1,0) AS Company1Diff 
    , today.Company2, today.Company2 - COALESCE(yesterday.Company2,0) AS Company2Diff 
FROM tbl AS today 
LEFT JOIN tbl AS yesterday 
ON DATEDIFF(today.DateTime, yesterday.DateTime) = 1 
ORDER BY today.DateTime ASC 
+0

非常好! (1)'LEFT JOIN tbl AS昨天WHERE ...'應該是'LEFT JOIN tbl AS昨天ON ...'(ON而不是WHERE),並且(2)注意一天中的時間差示例數據 - 連接表達式只需要比較日期而不是日期和時間,所以我建議'WHERE DATEDIFF(DATE(today.DateTime),DATE(yesterday.DateTime))= 1'。 –

+0

WHERE vs ON是一個錯字。但我不認爲DATE()是必需的。 (可能是最小的開銷,但沒有那麼少需要)。請參閱http://dev.mysql.com/doc/refman/5.1/zh-CN/date-and-time-functions.html#function_datediff – AgRizzo

+0

你是對的 - 'DATE()'不是必需的。我不知道「DATEDIFF」的「僅限日期部分」;感謝您指出了這一點 :) –

相關問題