有人能帮忙吗!我似乎解决不了这个难题?
输入表
DepartmentID EmpID
-----------------------
1 100
1 101
1 103
1 200
2 300
2 350
3 350
3 100
4 50
4 30
4 45
5 50
5 51
5 52
5 53
6 53
6 54
7 54
7 55
8 55
8 56
10 800
11 900
输出表
请注意,GroupID
是由我们创建的,它将有普通员工的部门分组,条件是1名员工不能在两个部门中。
GroupID Department
-----------------------
1000 1
1000 2
1000 3
1001 4
1001 5
1001 6
1001 7
1001 8
1002 10
1003 11
演示如何以及为什么对Department
1、2和3进行分组的示例:
EmpID
100在Department
1和3之间很常见,但是EmpID
350在2到3之间也很常见。所以把他们也分组。现在由部门1,2和3创建的小组没有任何其他部门的产品,那么我们就可以停止了。
注意:,这不是一个“正常”组,因为我们不想让我们创建的任何两个组都有相同的员工。
逻辑:
Step1: EmpID
50在部门4和5之间很常见。所以第4和第5组在一起。
Step2:,这意味着4&5集团有50,30,45,51,52,53名独特的员工。
Step3:,但是等等!Department
6的EmpID
53与step2组成的4& 5集团有共同之处
Step4:集团4,5,6部门。新集团拥有员工50,30,45,51,52,53,54人。
Step5:,但是等等!部门7的EmpID
为54,这与在step4成立的集团是很常见的。所以把他们聚在一起
这还在继续..。直到我们没有不分两组的员工。因此,在本例中,第7组也需要“合并”到第4步中提到的组中。
发布于 2014-10-24 03:07:44
这是一个需要递归CTE的图遍历问题。我认为这是一种方法:
with cte as (
select department, empid
from inputs
union all
select cte.department, i.empid
from inputs i join
cte
on i.empid = cte.empid and i.department <> cte.department
)
select department,
row_number() over (order by min(empid)) as groupid
from cte
group by deparment;
https://stackoverflow.com/questions/26540127
复制相似问题