我有一份承包商的工作人员名单,其中包括重复项目,因为有些人同时处理多份合同。我需要找到那个人的小时数最多的行,其次是最远的结束日期(如果小时数相同)。我想这是目前的主要合同。我还需要确保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对于每一行都是不同的,但如果在多个合同中,“姓名”对于该人来说是相同的。
由于
答案 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;