Предполагая, что ваши данные не очень плохие, вы можете использовать lag()
:
with toupdate as (
select t.*,
lag(enddate) over (partition by employee order by startdate) as prev_enddate
from t
) t
update toupdate
set startdate = dateadd(day, 1, prev_enddate)
where startdate <> dateadd(day, 1, prev_enddate);
Если ваши данные имеют много действительно сложных перекрытий, то это немного сложнее. По сути, вы хотите сохранить даты окончания и использовать их для вычисления дат начала - для всех, кроме первой строки:
with toupdate as (
select t.*,
lag(enddate) over (partition by employee order by enddate) as prev_enddate,
row_number() over (partition by employee order by startdate) as seqnum
from t
) t
update toupdate
set startdate = dateadd(day, 1, prev_enddate)
where seqnum <> 1 and
startdate <> dateadd(day, 1, prev_enddate);
Вам нужно seqnum
(или что-то подобное), потому что вы не гарантированы что самая ранняя дата начала имеет самую раннюю дату окончания в этой ситуации.