我需要使用 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 组中的多行代表最接近目标日期的情况。此解决方案将仅包含一行,并且在这种情况下,您无法保证包含多个有效值中的哪一行。
如果您想要包含表示最接近值的所有行,可以在查询中将 ROW_NUMBER() 更改为 RANK()。
关于sql - T-SQL - 按最近日期选择并按 ID 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4649665/