Хммм. Это проблема разрыва и островов. Вы можете определить, где начинаются острова, проверив, нет ли других рядов, перекрывающихся с ними. Для этого вы можете использовать совокупный максимум.
Это сблизит вас:
select t.*,
count(*) filter where (prev_end < start) over (order by start) as grp
from (select t.*,
max(end) over (order by start range between unbounded preceding and 1 preceding) as prev_end
from t
) t;
Однако связи в данных означают, что в них есть пробелы. Итак, еще один уровень:
select t.*, dense_rank() over (order by grp) as sequential_grp
from (select t.*,
count(*) filter (where prev_end < start) over (order by start) as grp
from (select t.*,
max(end) over (order by start range between unbounded preceding and 1 preceding) as prev_end
from t
) t
) t;
Здесь - это скрипта db <> - с измененными именами столбцов, потому что такие имена, как begin
и end
, равны SQL ключевые слова и, следовательно, плохая идея для имен столбцов.