這適用於樣本數據,但是如果有可能超過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