创建测试数据:
select * into #t
from (
select
1 ID, 10 EmployeeID, 'Sales Agent' JobTitle, cast('10/1/2016' as date) EffectiveDate
union select 3 ,10 ,'Sales Agent' ,'10/5/2016'
union select 7 ,10 ,'Sales Agent 2' ,'10/15/2016'
union select 9 ,10 ,'Sales Agent 3' ,'10/20/2016'
union select 15 ,10 ,'Sales Agent 3' ,'10/16/2016'
union select 2 ,2 ,'BSA III' ,'10/1/2016'
union select 4 ,2 ,'BSA II' ,'10/1/2016'
union select 14 ,2 ,'BSA III' ,'10/1/2016'
) a
代码:
;with cc as (
select ID, EmployeeID, JobTitle, EffectiveDate
, LEAD(JobTitle) over (partition by EmployeeID order by EffectiveDate, ID) NextJobTitle
, LAG(EffectiveDate) over (partition by EmployeeID, JobTitle order by EffectiveDate, ID) StartDate
, LEAD(EffectiveDate) over (partition by EmployeeID order by EffectiveDate, ID) EndDate
from #t
)
, c2 as (
select ID, EmployeeID
, JobTitle
, EffectiveDate
, NextJobTitle
, StartDate
, dateadd(day, -1, EndDate) EndDate
from cc
)
, c3 as (
select
EmployeeID, JobTitle
, IsNull(StartDate, EffectiveDate) as StartDate
, IsNull(EndDate, '2999-01-01') as EndDate
from c2
where JobTitle <> NextJobTitle or NextJobTitle is null
)
select *
from c3
where StartDate <= EndDate
结果:
╔════════════╦═══════════════╦════════════╦════════════╗
║ EmployeeID ║ JobTitle ║ StartDate ║ EndDate ║
╠════════════╬═══════════════╬════════════╬════════════╣
║ 2 ║ BSA III ║ 2016-10-01 ║ 2999-01-01 ║
╠════════════╬═══════════════╬════════════╬════════════╣
║ 10 ║ Sales Agent ║ 2016-10-01 ║ 2016-10-14 ║
╠════════════╬═══════════════╬════════════╬════════════╣
║ 10 ║ Sales Agent 2 ║ 2016-10-15 ║ 2016-10-15 ║
╠════════════╬═══════════════╬════════════╬════════════╣
║ 10 ║ Sales Agent 3 ║ 2016-10-16 ║ 2999-01-01 ║
╚════════════╩═══════════════╩════════════╩════════════╝
最后一行的“职位”应该是“销售代理3”的权利? – FLICKER
@ FLICKER是的,它应该。谢谢,我已经更新了这个问题。 – ScholarYoshi
@Beth不行,因为行ID 15覆盖行ID 9具有较早的生效日期。 – ScholarYoshi