1

아무도 도와 줄 수 있습니까? 나는 단지이 퍼즐을 해결하는 것 같지 않니?CTE to Group 다른 부서에있는 직원 다 수 많음 많음

입력 표

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 명 직원이 두 부서에서 할 수없는 상태로, 일반 직원이 그룹 부서에 우리가 만든 있습니다.

EmpID (100)는 3 & 1 Department 사이에 일반적이지만 기다립니다

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 350은 2 & 3 사이에서도 공통입니다. 그래서 그들을 그룹화하십시오. 이제 부서 1, 2 및 3이 만든 그룹에는 다른 부서에있는 제품이 없으므로 중단 할 수 있습니다.

참고 : 이것은 우리가 동일한 직원을 갖기 위해 만든 2 개의 그룹을 원하지 않기 때문에 '일반적인'그룹이 아닙니다.

는 LOGIC :

1 단계 :EmpID 50 4 & 5. 그래서 4 족 & 5 함께

2 단계 부서에서 공통이다 그래서 이것은 4 & 5 50,30가의기를 의미 , 45,51,52,53 명의 독창적 인 직원

3 단계 : 기다려라! Department (6)는 2 단계에서 형성된 4 & 5의 그룹, 일반 EmpID (53)가

4 단계 : 그룹 부서 4, 5, 6이 새로운 그룹은 50,30,45,51의 고유의 직원을 고용하고, 52,53,54

5 단계 : 기다려라! 부서 7은 EmpID이 54이며, 이는 단계 4에서 형성된 그룹과 공통입니다. 따라서 그룹으로 묶으십시오.

이것은 계속됩니다 .... 우리는 두 그룹이 아닌 어떤 직원도 가지지 않습니다. 따라서이 경우 그룹 7, 그룹 8도 4 단계에서 언급 한 그룹에 '병합'해야합니다.

답변

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;