如何以期望的方式对这些记录进行排名/过滤

时间:2014-01-08 16:10:17

标签: sql sorting sql-server-2008-r2 ranking

以下是: -

的示例数据
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

我有一些限制: -

  • 无法更改数据库(表格) - 规范化无可置疑
  • 实际数据非常庞大 - 超过600万条记录 - 性能必须
  • 实际数据包含更多字段(例如每个作业的付款,工作小时数等),因此分组无法完成

数据库位于 SQL Server 2008 R2 中。展望未来的解决方案。

1 个答案:

答案 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;