Suy*_*dwe 1 sql sorting ranking sql-server-2008-r2
以下是以下的示例数据: -
emp doa
1 2014-01-01 00:00:00.000
1 2014-01-05 00:00:00.000
1 2014-01-08 00:00:00.000
1 2014-01-12 00:00:00.000
1 2014-01-15 00:00:00.000
2 2014-01-01 00:00:00.000
2 2014-01-05 00:00:00.000
2 2014-01-10 00:00:00.000
2 2014-01-12 00:00:00.000
2 2014-01-15 00:00:00.000
3 2014-01-01 00:00:00.000
3 2014-01-05 00:00:00.000
4 2014-01-10 00:00:00.000
4 2014-01-12 00:00:00.000
4 2014-01-15 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
doa - 分配项目的日期
要求是选择最接近今天的记录 - 给予过去日期更高的偏好 - 这将表明当前的分配.
预期结果如下─
emp doa
1 2014-01-08 00:00:00.000
2 2014-01-05 00:00:00.000
3 2014-01-05 00:00:00.000
4 2014-01-10 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
我有一些限制: -
该数据库位于SQL Server 2008 R2中.展望未来的解决方案.
这似乎是一份工作row_number().困难的部分是让order by条款正确.我认为以下内容包含了您正在寻找的逻辑:
select ed.*
from (select ed.*,
row_number() over (partition by emp
order by (case when doa <= getdate() then 0 else 1 end),
abs(datediff(day, doa, getdate()))
) as seqnum
from empdoa ed
) ed
where seqnum = 1;
Run Code Online (Sandbox Code Playgroud)