Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

T-SQL:SELECT per data più vicina e GROUPED BY ID

puoi provare questo.

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
;

Non hai indicato come vuoi gestire il caso in cui più righe in un gruppo LinkedID rappresentano la più vicina alla data di destinazione. Questa soluzione includerà solo una riga e, in questo caso, non puoi garantire quale riga dei molteplici valori validi sia inclusa.

Puoi modificare ROW_NUMBER() con RANK() nella query se desideri includere tutte le righe che rappresentano il valore più vicino.