使用SQL根据单个组的传递/合并分配组号

使用SQL根据单个组的传递/合并分配组号,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,考虑下表 create table #table ( Name varchar(100), Group1 bigint, Group2 bigint, Group3 bigint ) insert into #table values('Adam', 276328, 00001, 0) insert into #table values('Bob', 276328, 00002, 0) insert into #table values('Cat

考虑下表

create table #table 
(
     Name varchar(100), 
     Group1 bigint, 
     Group2 bigint, 
     Group3 bigint
)

insert into #table values('Adam', 276328, 00001, 0)
insert into #table values('Bob', 276328, 00002, 0)
insert into #table values('Catherine', 927356, 00002, 0)
insert into #table values('Dave', 927356, 00003, 0)
insert into #table values('Eleanor', 927379, 00003, 0)
insert into #table values('Krampus', 927390, 00004, 0)
我正在尝试用新自动生成的组号更新Group3列

例如,最初的名字被预先分组为亚当、鲍勃、凯瑟琳、戴夫、埃莉诺,然后是克拉姆普斯,这在第一组中很明显

第二组的名字是亚当、鲍勃和凯瑟琳、戴夫和埃莉诺,然后是克拉姆普斯

我想做的是,使用组1和组2来分配一个新的组3,该组3可以过渡地对所有这些组进行分组

比如亚当、鲍勃、凯瑟琳、戴夫和埃莉诺,因为亚当和鲍勃在第1组被分组,鲍勃和凯瑟琳在第2组被分组,这意味着,他们都被过渡地分组在一起

输出如下:

'Adam', 276328, 00001, 00001
'Bob', 276328, 00002, 00001
'Catherine', 927356, 00002, 00001
'Dave', 927356, 00003, 00001
'Eleanor', 927379, 00003, 00001
'Krampus', 927390, 00004, 00002

我已经玩过等级,密集等级-但找不到一种方法来过渡地将所有等级分组

这是一个图形漫游问题,因为a和B可能在组1中。然后A和C可能在第2组。然后C和D可能在第1组

这表明了一个递归的CTE:

with cte as (
      select name, group1, group2, convert(varchar(max), ',' + name + ',') as visited, name as grouping
      from t
      union all
      select cte.name, t.group1, t.group2, concat(visited, t.name, ','),
             (case when cte.name < t.name then cte.name else t.name end)
      from cte join
           t
           on cte.group1 = t.group1 or
              cte.group2 = t.group2
      where visited not like '%,' + t.name + ',%'
     )
select name, dense_rank() over (order by min(grouping)) as grp
from cte
group by name;

是一个很有趣的问题。

非常有趣。+1