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

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)

我有一些限制: -

  • 数据库(表)无法更改 - 规范化是不可能.
  • 实际数据非常庞大 - 超过600万条记录 - 性能必不可少.
  • 实际数据有更多的字段(例如每个分配的付款,工作小时数等),因此也无法进行分组.

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

Gor*_*off 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;
Run Code Online (Sandbox Code Playgroud)