Это похоже на проблему пробелов. Вот один из способов ее решения с помощью оконных функций:
select
min(person_date) person_date_start,
max(person_date) person_date_end,
person,
number_one
from (
select
t.*,
row_number() over(order by person_date) rn1,
row_number() over(partition by person, number_one order by person_date) rn2
from mytable t
) t
group by person, number_one, rn1 - rn2
Совершенно неясно, что такое логический c для генерации id
во внешнем запросе. Если вы хотите перенумеровать записей, то вы можете использовать row_number()
:
select
row_number() over(order by min(person_date)) id,
min(person_date) person_date_start,
max(person_date) person_date_end,
person,
number_one