Начиная с SQL Server 2012, вы можете использовать LAG
(подробнее здесь ) для сравнения значений между различными строками таблицы:
declare @tmp table (employee_id int, company varchar(10), hire_date date, term_date date)
insert into @tmp values
(1,'','2017-01-01','2017-07-01')
,(1,'','2018-01-01','2018-06-15')
,(1,'','2018-04-01','9999-12-31')
select employee_id, min(hire_date) as hire_date, max(term_date) as term_date
from
(
select employee_id, hire_date, term_date, max (tmp1) over (partition by employee_id order by hire_date asc) as tmp2
from
(
SELECT employee_id,
hire_date,
isnull (term_date, '9999-12-31') term_date,
case
when
(hire_date not between lag(hire_date) over (partition by employee_id order by hire_date asc)
and isnull( lag(term_date) over (partition by employee_id order by hire_date asc), '9999-12-31') )
or lag(hire_date) over (partition by employee_id order by hire_date asc) is null
then
row_number() over (partition by employee_id order by hire_date asc)
end as tmp1
FROM @tmp
) x
) y
group by employee_id, tmp2
Результаты:
