2011-09-10 105 views
6

我想計算同一個表中不同行之間唯一日期字段的差異。在MySQL中選擇行日期之間的差異

例如,給出以下數據:

id | date 
    ---+------------ 
    1 | 2011-01-01 
    2 | 2011-01-02 
    3 | 2011-01-15 
    4 | 2011-01-20 
    5 | 2011-01-10 
    6 | 2011-01-30 
    7 | 2011-01-03 

我想生成產生以下的查詢:

id | date  | days_since_last 
---+------------+----------------- 
1 | 2011-01-01 | 
2 | 2011-01-02 | 1 
7 | 2011-01-03 | 1 
5 | 2011-01-10 | 7 
3 | 2011-01-15 | 5 
4 | 2011-01-20 | 5 
6 | 2011-01-30 | 10 

什麼日期函數我會在MySQL中使用任何建議,或者是否有一個子選擇可以做到這一點?

(當然,我不介意把WHERE date > '2011-01-01'忽略的第一行。)

+0

這是它會是不錯的是MySQL的支持分析,鉛和LAG要具體... –

回答

2

相關子查詢可能會有所幫助:

SELECT 
    id, 
    date, 
    DATEDIFF(
    (SELECT MAX(date) FROM atable WHERE date < t.date), 
    date 
) AS days_since_last 
FROM atable AS t 
+0

這會工作,這很好,但是由於嵌套子查詢(你會做「n」表掃描)。最好的方法是在日期排序後使用一個變量來存儲前一行的日期值 - 並且只做一次。我現在不能被打擾,但如果你想要去... :) – Bohemian

+0

這是我以爲我在尋找的東西,但正如波希米亞所說的那樣,表現會受到傷害。花了28分鐘才完成(約26,000行)。我選擇這個作爲我的問題的最佳答案,但爲了理智,最好使用臨時表並遵循Krtek的答案。 –

+0

@Mike S .:我有兩件事感到驚訝。首先,我很驚訝它在這麼一張小桌子上表現得如此糟糕。請不要誤解我的意思,我已經意識到這個解決方案可能不是最快的解決方案,甚至可能會低於平均水平,但在26,000行28分鐘內......可能是因爲表中沒有索引'?無論如何,讓我感到驚訝的另一件事是,你首先選擇了這個答案。 :)我的意思是我很欣賞它,謝謝,但請相信我,根據您自己的話,我自己現在發現Krtek的答案更接近「正確」的解決方案,不管最終結果如何。 –

0

像這樣的東西應該工作:

SELECT mytable.id, mytable.date, DATEDIFF(mytable.date, t2.date) 
FROM mytable 
LEFT JOIN mytable AS t2 ON t2.id = table.id - 1 

然而,這意味着你的id是連續的表,否則這根本不起作用。也許MySQL會抱怨第一行,因爲t2.date將是null,但我沒有時間現在檢查。

+0

你打我的答案,讓我'我只是添加我的作品,並建議他看看文檔:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff – Tchami

+0

@Krtek,謝謝爲快速反應。我必須更新我的問題以更好地反映情況,因爲ID不按時間順序排列。 –

+0

@Tchami - 感謝您的信任投票。 ;)放心,我知道文檔的位置,並經常諮詢。 –