2012-10-17 17 views
2

考慮一個帶有datetime字段的MySQL表。我想選擇最後一個或前一個datetime值之間的行。例如,如果存在記錄具有以下值:絕大多數獨立記錄

1 2012-10-17 12:00 
2 2012-10-16 12:00 
3 2012-10-14 12:00 
4 2012-10-08 12:00 
5 2012-10-03 12:00 
6 2012-10-01 12:00 

因此最「分離的」的記錄是記錄#4,因爲它是從最近的記錄5天程。

請注意,可能存在或不存在「最孤立」的關係,在這種情況下,可能會返回任何綁定行或全部關聯。此外,雖然該示例顯示了按順序排列的datetime值的記錄,但在實際數據集中可能不一定是這樣。

+2

通過孤立的,你看看平均上一頁和下一頁的記錄,或最小的2? – PinnyM

+0

@PinnyM最近的 – madth3

+0

@PinnyM:其實任何一種方法都可以接受。我對看到兩種方法如何實現感興趣。 – dotancohen

回答

1

你可以用它來確定到最近記錄的距離:

SELECT foo.d, TIMESTAMPDIFF(DAY, max(earlier.d), d) as previous, TIMESTAMPDIFF(DAY, d, min(later.d)) as next 
FROM foo 
LEFT JOIN foo later ON foo.d < later.d 
LEFT JOIN foo earlier ON foo.d > earlier.d 
GROUP BY foo.d 

你可以得到最遠的這些值相當容易。

+0

謝謝,'小於'的'JOIN'非常聰明!我會玩這個,很快回來。 – dotancohen

3

如果你的表是類似foo(ID,時間)來定義,你可以使用下面的SQL:

SELECT t1.id FROM foo t2 
    INNER JOIN foo t1 ON t1.id=t2.id+1 
    INNER JOIN foo t3 ON t3.id=t1.id+1 
    WHERE timestampdiff(day,t1.time,t2.time)+timestampdiff(day,t3.time,t1.time)= 
    (SELECT max(timestampdiff(day,t1.time,t2.time)+timestampdiff(day,t3.time,t1.time)) 
     FROM foo t2 INNER JOIN foo t1 ON t1.id=t2.id+1 
        INNER JOIN foo t3 ON t3.id=t1.id+1) 

把所有的「最孤立」的條目。如果您只需要一個條目,則可以隨時添加limit 1
另請注意,這裏我們假設條目按時間戳排序。如果條目未按時排序,您可以創建一個視圖來訂購它們。

sqlfiddle