with d as (
select
customer_id,
row_number() over(order by return_date, rental_date) as row_num,
rental_date as start_date,
return_date as finish_date,
lag(return_date, 1) over (order by return_date, rental_date) as prev_return_date
from rental
where customer_id = 1
order by row_num
),
islands as (
select
*,
sum(case when d.prev_return_date >= start_date then 0 else 1 end) over (order by row_num) period_id
from d
)
select
period_id ,
min(start_date) start_date,
max(finish_date) finish_date
from islands
group by island_id;