Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

T-SQL - SELECT pela data mais próxima e GROUPED BY ID


você pode tentar isso.
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
;

Você não indicou como deseja lidar com o caso em que várias linhas em um grupo LinkedID representam o mais próximo da data de destino. Esta solução incluirá apenas uma linha e, neste caso, você não pode garantir qual linha dos vários valores válidos está incluída.

Você pode alterar ROW_NUMBER() com RANK() na consulta se quiser incluir todas as linhas que representam o valor mais próximo.