以下是: -
的示例数据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
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
我有一些限制: -
数据库位于 SQL Server 2008 R2 中。展望未来的解决方案。
答案 0 :(得分:5)
这似乎是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;