TSQL - 返回具有最高值和最长日期的重复行

时间:2018-02-26 00:46:58

标签: sql-server tsql

我有一份承包商的工作人员名单,其中包括重复项目,因为有些人同时处理多份合同。我需要找到那个人的小时数最多的行,其次是最远的结束日期(如果小时数相同)。我想这是目前的主要合同。我还需要确保Date From和Date to介于当前日期之间 - 如何做到这一点?

+------------+----------+------+-------+------------+------------+
| ContractID | PersonID | Name | Hours | Date From  |  Date To   |
+------------+----------+------+-------+------------+------------+
|          8 |        1 | John |    30 | 20/02/2018 | 26/02/2018 |
|          8 |        2 | Paul |     5 | 20/02/2018 | 26/02/2018 |
|          7 |        3 | John |     7 | 20/02/2018 | 26/02/2018 |
+------------+----------+------+-------+------------+------------+

在上面的例子中,我需要带回John - 30hours和Paul 5 Hours行。 PS - PersonID对于每一行都是不同的,但如果在多个合同中,“姓名”对于该人来说是相同的。

由于

1 个答案:

答案 0 :(得分:1)

一种方法就是使用exists和适当的排序逻辑:

select c.*
from contracts c
where c.contractid = (select top 1 c2.contractid
                      from contracts c2
                      where c2.name = c.cname and
                            getdate() >= c2.datefrom and
                            getdate() < c2.dateto
                      order by c2.hours desc, c2.dateto desc
                     );

您可以将类似的逻辑放入窗口函数中:

select c.*
from (select c.*,
             row_number() over (partition by c.name order by c.hours desc, c.dateto desc) as seqnum
      from contracts c
      where getdate() >= c.dateto and getdate() < c.datefrom 
     ) c
where seqnum = 1;