2015-09-07 38 views
3

我在表中有一些重复的值,我试图用Row_Number将它们过滤掉。我想使用datediff来排序行,并根据最接近零的值排序结果,但我正在努力考虑负值。按最接近零的SQL Server顺序

下面是数据的样本,我目前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 

我对上面的select语句是:

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 

我想要做的是改变排序顺序如下显示:

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 

S ο与DischargeDate最接近的DaysToSurvey值排名为rn 1.

这可能吗?

回答

5

你靠近。只需添加ABS()计算的差的绝对值:

ROW_NUMBER() OVER (
    PARTITION BY PersonID 
    ORDER BY abs(datediff(dd, dischargedate, surveydate)) asc 
) AS rn 
2

你可以使用abs从零获得的距离:

select PersonID, SurveyDate, DischargeDate, datediff(dd,dischargedate,surveydate) days, 
    ROW_NUMBER() over (partition by PersonID order by abs(datediff(dd,dischargedate,surveydate)) asc) as rn 
from Table 1 
order by PersonID, rn 
+0

完美,感谢 – GullitsMullet

2

加入ABS():

select PersonID, SurveyDate, DischargeDate, datediff(dd,dischargedate,surveydate) days, 
    ROW_NUMBER() over (partition by PersonID order by ABS(datediff(dd,dischargedate,surveydate)) asc) as rn 
from Table 1 
order by PersonID, rn 
+0

完美,谢谢 – GullitsMullet