从下面的数据中,我需要使用SQL Server 2005为每个链接ID选择最接近指定日期的记录:
ID Date Linked ID ........................... 1 2010-09-02 25 2 2010-09-01 25 3 2010-09-08 39 4 2010-09-09 39 5 2010-09-10 39 6 2010-09-10 34 7 2010-09-29 34 8 2010-10-01 37 9 2010-10-02 36 10 2010-10-03 36
因此,使用01/10/2010选择它们应返回:
1 2010-09-02 25 5 2010-09-10 39 7 2010-09-29 34 8 2010-10-01 37 9 2010-10-02 36
我知道这是有可能的,但似乎无法绕开我的头脑(必须太接近一天的结束了:P)如果有人可以帮助或朝正确的方向轻轻推一下,将不胜感激!
编辑: 另外我也遇到了这个sql以获取最接近的日期:
abs(DATEDIFF(minute, Date_Column, '2010/10/01'))
但无法弄清楚如何正确地整合到查询中…
谢谢
你可以试试看
DECLARE @Date DATE = '10/01/2010'; WITH cte AS ( SELECT ID, LinkedID, ABS(DATEDIFF(DD, @date, DATE)) diff, ROW_NUMBER() OVER (PARTITION BY LinkedID ORDER BY ABS(DATEDIFF(DD, @date, DATE))) AS SEQUENCE FROM MyTable ) SELECT * FROM cte WHERE SEQUENCE = 1 ORDER BY ID ;
您没有说明如何处理LinkedID组中的多行代表最接近目标日期的情况。此解决方案将仅包含一行,并且在这种情况下,您不能保证包含多个有效值的哪一行。
如果要包括代表最接近值的所有行,可以在查询中用RANK()更改ROW_NUMBER()。