Это проблема пробелов и островков, но с диапазонами дат.Самое общее решение состоит в том, чтобы предположить, что между строками могут быть пробелы (хотя ваши данные этого не имеют).
Вы можете решить эту проблему, выяснив, где начинаются «периоды постоянства».В этом случае lag()
ваш друг.Затем, когда вы найдете, где они начинаются, совокупная сумма идентифицирует группы, и агрегация решает проблему:
select employee_id, employee_type,
min(start_date), max(end_date)
from (select e.*,
sum(case when start_date = dateadd(day, 1, prev_end_date) then 1 else 0 end) over
(partition by employee_id, employee_type) as grp
from (select e.*,
lag(end_date) over (partition by employee_id, employee_type order by start_date) as prev_end_date
from employee e
) e
) e
group by employee_id, employee_type, grp;