CTE to Group不同部门的员工多对多

时间:2014-10-24 01:29:30

标签: sql sql-server group-by many-to-many common-table-expression

任何人都可以帮忙!我似乎无法解决这个难题?

输入表

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部门创建的集团没有任何其他部门的产品,那么我们就可以停止了。

注意:这不是正常的'因为我们不希望我们创建的任何2个团队拥有相同的员工。

LOGIC:

第1步: EmpID 50在部门4&所以第4组和第4组。 5在一起

Step2:所以这意味着4人小组和5有50,30,45,51,52,53名独特员工

第3步:但是等等! Department 6 {4}与{4}组共有EmpID 53 5,在step2中形成

Step4:集团部门4,5和6.这个新组拥有50,​​30,45,51,52,53,54的独特员工

Step5:但是等等!部门7的EmpID为54,这与第4步中形成的集团相同。所以将它们组合在一起

这继续......直到我们没有任何不属于两组的员工。因此,在第7组中,第8组也需要合并。进入步骤4中提到的小组。

1 个答案:

答案 0 :(得分:1)

这是一个需要递归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;