В общем, это проблема обхода графика, как говорит @GordonLinoff, но если задачу можно сократить до такой же, как в вашем примере, с ограниченными столбцами и правилом упорядочения (я предположил, что порядок строк определяется вашими столбцами),задача вполне решаема. Посмотрите эту демонстрацию, используя ваш набор данных, она дает желаемый результат (см. Комментарии в коде):
with your_data as ( --your data example
select stack (5,
1, 2,
1, 3,
2, 3,
4, 5,
6, 7
) as (v1,v2)
) --your data example
select v1, v2, --calculate group Id as a running count of new_grp
count(new_grp) over(order by v1, v2 rows between unbounded preceding and current row) as gid
from
(
select v1, v2, --calculate new_grp flag
case when ((not array_contains(prev_tuple,v1) and not array_contains(prev_tuple,v2)) or prev_tuple is null) then true end as new_grp
from
(
select v1, v2, lag(tuple) over (order by v1, v2) prev_tuple --get previous values in array, to simplify code a little bit
from (select v1, v2, array(v1, v2) as tuple from your_data) s
)s
)s;
Результат:
v1 v2 gid
1 2 1
1 3 1
2 3 1
4 5 2
6 7 3