2011-06-14 123 views
3

假設下面T-SQL - 獲取最新的日期和最近的未來日期

ID Name  AppointmentDate 
-- -------- --------------- 
1  Bob   1/1/2010 
1  Bob   5/1/2010 
2  Henry  5/1/2010 
2  Henry  8/1/2011 
3  John  8/1/2011 
3  John  12/1/2011 

我想找回被人最近的預約日期的記錄表。所以我需要一個會給出以下結果集的查詢。

1 Bob 5/1/2010 (5/1/2010 is most recent) 
2 Henry 8/1/2011 (8/1/2011 is most recent) 
3 John 8/1/2011 (has 2 future dates but 8/1/2011 is most recent) 

謝謝!

+0

可能重複[這](http://stackoverflow.com/questions/189213/sql-selecting-rows-by-most-recent-date) – 2011-06-14 16:04:06

+0

如果您發佈代碼,XML或數據樣本,請** **在文本編輯器中點擊這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以良好地格式化和語法突出顯示它! – 2011-06-14 16:04:28

+0

可能你可以按名稱使用max(AppointmentDate)組。 – Rahul 2011-06-14 16:04:41

回答

9

假設你說「最近」的意思是「最接近」,如「存儲日期是距離當前日期的最少天數,我們不在乎它是否在當前日期之前或之後」,則這應該這樣做(可能需要瑣碎調試):

SELECT ID, Name, AppointmentDate 
from (select 
      ID 
      ,Name 
      ,AppointmentDate 
      ,row_number() over (partition by ID order by abs(datediff(dd, AppointmentDate, getdate()))) Ranking 
     from MyTable) xx 
where Ranking = 1 

這usese從2005年的SQL的ROW_NUMBER()函數。子查詢根據規格「訂購」數據,主查詢選擇最適合的數據。

還要注意的是:

  • 搜索是基於當前日期
  • 我們只計算日差,時間(小時,分鐘等)被忽略
  • 如果兩個天是等距離的(比如2和2之後),我們隨機挑選一個

所有這些都可以根據您的最終要求進行調整。

+0

+1爲優雅的解決方案。 – 2011-06-14 16:32:36

+0

啊完美!您的假設是正確的,因爲搜索是基於當前日期。謝謝你的幫助! – biggo78 2011-06-14 17:19:19

2

(菲利普打我的重拳,窗口函數是一個很好的選擇。這裏有一個替代方法:)

假設我正確地理解你的要求,因爲得到的日期最接近於本日起,無論是在過去未來,考慮這個查詢:中

SELECT t.Name, t.AppointmentDate 
FROM 
(
    SELECT Name, AppointmentDate, ABS(DATEDIFF(d, GETDATE(), AppointmentDate)) AS Distance 
    FROM Table 
) t 
JOIN 
(
    SELECT Name, MIN(ABS(DATEDIFF(d, GETDATE(), AppointmentDate))) AS MinDistance 
    FROM Table 
    GROUP BY Name 
) d ON t.Name = d.Name AND t.Distance = d.MinDistance 
+0

對於一個正確答案+1(儘管該列被稱爲AppointmentDate)。菲利普斯的答案雖然漂亮。 – 2011-06-14 16:34:07

+0

修復了列名稱。但對於不夠好,我很抱歉。我就是這樣誕生的。;) – 2011-06-14 16:37:38

+0

SQL只有它的母親纔會喜歡! ;-) – 2011-06-14 16:40:46