Вы можете использовать row_number()
.Ниже указаны группы смежных свободных мест:
select t.*, (seqnum - seqnum_s) as grp
from (select t.*,
row_number() over (partition by row_num order by seat_number) as seqnum,
row_number() over (partition by row_num, status order by seat_number) as seqnum_s
from t
) t
where status = 'Free';
Вы можете добавить номер, используя дополнительные функции окна:
select t.*
from (select t.*,
count(*) over (partition by row_num, seqnum - seqnum_s, status) as cnt
from (select t.*,
row_number() over (partition by row_num order by seat_number) as seqnum,
row_number() over (partition by row_num, status order by seat_number) as seqnum_s
from t
) t
where status = 'Free'
) t
where cnt >= 3;