这适用于样本数据,但是如果有可能超过1组的合同,这将是无效连续会失败。
declare @table table (id int, contract int, StartDate date, EndDate date)
insert into @table
values
(1000,1,'20170831',NULL),
(1000,2,'20170916',NULL),
(1000,3,'20170914',NULL)
;with cte as(
select
id
,contract
,StartDate
,EndDate
,NewEndDate = case when StartDate > lead(StartDate) over (partition by id order by contract) then StartDate else lead(StartDate) over (partition by id order by contract) end
from @table t),
cte2 as(
select
id
,contract
,StartDate
,EndDate
,NewEndDate = case when NewEndDate = Lead(NewEndDate) over (partition by id order by contract) then Lead(StartDate,2) over (partition by id order by contract) else NewEndDate end
from
cte
)
update cte2
set EndDate = NewEndDate
select * from @table
编辑成一排99无效
declare @table table (id int, contract int, StartDate date, EndDate date)
insert into @table
values
(1000,1,'20170831',NULL),
(1000,2,'20170916',NULL),
(1000,2,'20170915',NULL),
(1000,3,'20170914',NULL)
;with cte as(
select
id
,contract
,StartDate
,EndDate
,NewEndDate =min(StartDate) over (partition by id order by contract ROWS BETWEEN 1 FOLLOWING AND 99 FOLLOWING)
from
@table),
cte2 as(
select
id
,contract
,StartDate
,EndDate
,NewEndDate = isnull(case when NewEndDate = lag(NewEndDate) over (partition by id order by contract) then StartDate else NewEndDate end,'99991231')
from
cte)
update cte2
set EndDate = NewEndDate
select * from @table
什么版本的SQL Server? – scsimon
Hi Scsimon,这是SQL 2014. – user3497385