bạn có thể thử cái này.
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
;
Bạn đã không chỉ ra cách bạn muốn xử lý trường hợp nhiều hàng trong nhóm LinkedID đại diện cho ngày gần nhất với mục tiêu. Giải pháp này sẽ chỉ bao gồm một hàng Và trong trường hợp này, bạn không thể đảm bảo hàng nào trong số nhiều giá trị hợp lệ được bao gồm.
Bạn có thể thay đổi ROW_NUMBER () bằng RANK () trong truy vấn nếu bạn muốn bao gồm tất cả các hàng đại diện cho giá trị gần nhất.