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

Sql server T-SQL-获取最近日期和未来最新日期,sql-server,tsql,Sql Server,Tsql,假设记录表如下 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 我想按个人检索最近的约会日

假设记录表如下

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)

谢谢

假设您所说的“最近”是指“最近的”,如“存储日期是距离当前日期最少的天数,我们不关心它是在当前日期之前还是之后”,则应该这样做(可能需要进行简单的调试):

这将使用SQL 2005及更高版本中的row_number()函数。子查询根据规范“排序”数据,主查询选择最佳匹配

还请注意:

  • 搜索基于当前日期
  • 我们只计算以天为单位的差异,忽略时间(小时、分钟等)
  • 如果两天是等距的(比如说,前两天和后两天),我们随机选择一天
所有这些都可以根据您的最终要求进行调整。

(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

如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!也许你可以按姓名使用max(AppointmentDate)组。你没有说清楚你想要什么。。。。请重新表述/扩展您的问题!另外:“Henry”在您的表格中有一个
8/1/2011
约会-但是在您的输出中,您给他一个
8/1/2010
(2010而不是2011)约会日期-只是一个打字错误???@Rahul:这对“John”不起作用,不过….+1是正确的答案(尽管该列被称为AppointmentDate)。菲利普斯的答案更漂亮。修复了列名。但是关于不够漂亮,我很抱歉。我生来就是这样的SQL只有它的母亲才能爱!;-)啊,太好了!您的假设是正确的,因为搜索基于当前日期。谢谢你的帮助!
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