Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

T-SQL - SELECT par date la plus proche et GROUPED BY ID

vous pouvez essayer ceci.

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
;

Vous n'avez pas indiqué comment vous souhaitez gérer le cas où plusieurs lignes dans un groupe LinkedID représentent la date la plus proche de la cible. Cette solution n'inclura qu'une seule ligne Et, dans ce cas, vous ne pouvez pas garantir quelle ligne des multiples valeurs valides est incluse.

Vous pouvez remplacer ROW_NUMBER() par RANK() dans la requête si vous souhaitez inclure toutes les lignes qui représentent la valeur la plus proche.