2011-06-14 126 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