SQL Server按最接近的值排序为零

Gul*_*let 3 sql sql-server select row-number sql-order-by

我在表中有一些重复的值,我试图用它Row_Number来过滤它们.我想使用排序行datediff并根据最接近的值将结果排序为零,但我正在努力解释负值.

以下是数据和我当前Row_Number字段的示例(rn)列:

PersonID    SurveyDate  DischargeDate   DaysToSurvey    rn
93638       10/02/2015  30/03/2015      -48             1
93638       27/03/2015  30/03/2015      -3              2
250575      23/10/2014  29/10/2014      -6              1
250575      19/11/2014  24/11/2014      -5              2
203312      23/01/2015  26/01/2015      -3              1
203312      26/01/2015  26/01/2015      0               2
387737      19/02/2015  26/02/2015      -7              1
387737      26/02/2015  26/02/2015      0               2
751915      02/04/2015  04/04/2015      -2              1
751915      10/04/2015  25/03/2015      16              2
712364      24/01/2015  30/01/2015      -6              1
712364      26/01/2015  30/01/2015      -4              2
Run Code Online (Sandbox Code Playgroud)

我对上面的选择声明是:

select 
    PersonID, SurveyDate, DischargeDate, 
    datediff(dd,dischargedate,surveydate) days, 
    ROW_NUMBER () over (partition by PersonID 
                        order by datediff(dd, dischargedate, surveydate) asc) as rn
from 
    Table 1
order by 
    PersonID, rn
Run Code Online (Sandbox Code Playgroud)

我想要做的是更改排序顺序,使其显示如下:

PersonID    SurveyDate  DischargeDate   DaysToSurvey    rn
93638       27/03/2015  30/03/2015      -3              1
93638       10/02/2015  30/03/2015      -48             2
250575      19/11/2014  24/11/2014      -5              1
250575      23/10/2014  29/10/2014      -6              2
Run Code Online (Sandbox Code Playgroud)

所以DaysToSurvey最接近的值DischargeDate排在第1位.

这可能吗?

Luk*_*der 5

你很亲密 只需添加ABS()计算差异的绝对值:

ROW_NUMBER () OVER (
  PARTITION BY PersonID 
  ORDER BY abs(datediff(dd, dischargedate, surveydate)) asc
) AS rn
Run Code Online (Sandbox Code Playgroud)