T-SQL - 获取最近日期和最近未来日期

3
假设下面是记录的表格:
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)

谢谢!


可能是重复的问题,与此问题相同。 - Hasan Fahim
如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮 ({})以使其得到良好的格式化和语法高亮显示! - marc_s
可能你可以使用 max(AppointmentDate) 按名称分组。 - Rahul
@Rahul:不过这在“约翰”身上行不通.... - marc_s
max(appointmentdate)将适用于Bob和Henry;我在处理有两个未来日期的John时遇到了麻烦。 - biggo78
显示剩余3条评论
2个回答

9

假设你所说的“most recent”是指“最接近”,也就是“存储日期距离当前日期最近,而且我们不在乎它是在当前日期之前还是之后”,那么这个代码应该可以实现(可能需要进行简单的调试):

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()函数。子查询按照规定对数据进行排序,主查询选择最佳匹配项。
还请注意:
- 搜索基于当前日期 - 我们仅计算天数差异,时间(小时、分钟等)被忽略 - 如果两个日期距离相等(比如2天之前和2天之后),我们随机选择一个
所有这些都可以根据您的最终要求进行调整。

啊,太好了!你的假设是正确的,搜索是基于当前日期的。感谢你的帮助! - biggo78

2
< p >(Phillip比我更快地完成了任务,窗口函数是一个很好的选择。这是另一种方法:)< /p> < p >假设我正确理解了您的要求,即获取与当前日期最接近的日期,无论是在过去还是未来,请考虑以下查询:< /p>
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

+1 对于正确答案(尽管该列被称为 AppointmentDate)。不过,Phillips 的回答更漂亮。 - Jon Egerton
修正了列名。但是关于不够漂亮,我很抱歉。我就是这样天生的。;) - Dan J
SQL只有它的母亲会喜欢!;-) - Jon Egerton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接