Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

T-SQL - SELECT nach dem nächsten Datum und GROUPED BY ID

Sie können dies versuchen.

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
;

Sie haben nicht angegeben, wie Sie mit dem Fall umgehen möchten, in dem mehrere Zeilen in einer LinkedID-Gruppe dem Zieldatum am nächsten kommen. Diese Lösung enthält nur eine Zeile. Und in diesem Fall können Sie nicht garantieren, welche Zeile der mehreren gültigen Werte enthalten ist.

Sie können ROW_NUMBER() mit RANK() in der Abfrage ändern, wenn Sie alle Zeilen einbeziehen möchten, die den nächsten Wert darstellen.