Đây là một dạng vấn đề về khoảng cách và đảo với chuỗi ngày. Tôi khuyên bạn nên sử dụng left join
để tìm nơi bắt đầu của các hòn đảo. Sau đó là tổng tích lũy và tổng hợp:
select emp_id, title, min(start_date), max(end_date)
from (select t.*,
sum(case when tprev.emp_id is null then 1 else 0 end) over
(partition by t.emp_id, t.title order by t.start_date) as grouping
from t left join
t tprev
on t.emp_id = tprev.emp_id and
t.title = tprev.title and
t.start_date = tprev.end_date + 1
) t
group by grouping, emp_id, title;