Вычисление мастер-группы - это проблема хождения по графику, которая подразумевает рекурсивное CTE. Я хотел бы подойти к этому следующим образом:
- Создание ребер между группами на основе значений.
- Обход ребер без посещения предыдущих групп.
тогда расчет основной группы является минимумом посещенных групп для каждой группы.
В SQL это выглядит так:
with edges as (
select distinct t1.group_id as group_id_1, t2.group_id as group_id_2
from t t1 join
t t2
on t1.value = t2.value
),
cte as (
select e.group_id_1, e.group_id_2, convert(varchar(max), concat(',', group_id_1, ',', group_id_2)) as visited, 1 as lev
from edges e
union all
select cte.group_id_1, e.group_id_2,
concat(visited, e.group_id_2, ','), lev + 1
from cte join
edges e
on e.group_id_1 = cte.group_id_2
where cte.visited not like concat('%,', e.group_id_2, ',%') and lev < 5
)
select group_id_1, dense_rank() over (order by min(group_id_2)) as master_group
from cte
group by group_id_1;
Здесь - это дб <> скрипку.