假设下面的记录表
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 :(得分: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
这将使用SQL 2005及更高版本中的row_number()函数。子查询按照规范“排序”数据,主查询选择最合适的数据。
另请注意:
所有这些都可以根据您的最终要求进行调整。
答案 1 :(得分:2)
(Phillip打败了我,并且窗口功能是一个很好的选择。这是另一种方法:)
假设我正确理解您的要求为最接近当前日期,无论是过去还是未来,请考虑以下问题:
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