T-SQL - SELECT by nearest date and GROUPED BY ID

后端 未结 3 953
情深已故
情深已故 2021-01-05 21:26

From the data below I need to select the record nearest to a specified date for each Linked ID using SQL Server 2005:

ID     Date      Linked ID         


        
相关标签:
3条回答
  • 2021-01-05 21:37

    you can try this.

    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
    ;
    

    You didn't indicate how you want to handle the case where multiple rows in a LinkedID group represent the closest to the target date. This solution will only include one row And, in this case you can't guarantee which row of the multiple valid values is included.

    You can change ROW_NUMBER() with RANK() in the query if you want to include all rows that represent the closest value.

    0 讨论(0)
  • 2021-01-05 21:38

    You want to look at the absolute value of the DATEDIFF function (http://msdn.microsoft.com/en-us/library/ms189794.aspx) by days.

    The query can look something like this (not tested)

    with absDates as 
    (
       select *, abs(DATEDIFF(day, Date_Column, '2010/10/01')) as days
       from table
    ), mdays as
    ( 
       select min(days) as mdays, linkedid
       from absDates
       group by linkedid
    )
    select * 
    from absdates
    inner join mdays on absdays.linkedid = mdays.linkedid and absdays.days = mdays.mdays
    
    0 讨论(0)
  • 2021-01-05 21:46

    You can also try to do it with a subquery in the select statement:

    select  [LinkedId],
            (select top 1 [Date] from [Table] where [LinkedId]=x.[LinkedId] order by abs(DATEDIFF(DAY,[Date],@date)))
    from    [Table] X
    group by [LinkedId]
    
    0 讨论(0)
提交回复
热议问题