안녕하세요.
며칠을 아무리 해봐도 안되서 도움을 요청드립니다.
1.테이블 구조
< 원본 테이블 = X > RANK는 숫자형
여기서 RANK는 CD1의 특정 값을 가지고 부여한 것입니다
CD1 | CD2 | RANK |
A1 | A2 | 1 |
A1 | A3 | 1 |
A2 | A1 | 2 |
A2 | A4 | 2 |
A2 | A5 | 2 |
A3 | A1 | 3 |
A3 | A5 | 3 |
A4 | A2 | 3 |
A5 | A3 | 4 |
A5 | A4 | 4 |
A5 | A6 | 4 |
A5 | A3 | 4 |
2.결과테이블 생성방법
[STEP1]
- 위의 원본 테이블 X 테이블에서 RANK = 1인 행을 모두 추출 = Y1
- 원본 테이블 X에서 RANK = 1인 행을 모두 삭제
- Y1테이블을 임시테이블로 저장하여 원본 테이블 X의 CD2와 Y1테이블의 CD2가 존재하는 경우 삭제
STEP1 결과
Y1테이블 X 테이블
(RANK = 1을 삭제하고 Y1의 CD2 값이 X의 CD2에 존재하는 경우 삭제)
CD1 | CD2 | RANK | CD1 | CD2 | RANK | |
A1 | A2 | 1 | A2 | A1 | 2 | |
A1 | A3 | 1 | A2 | A4 | 2 | |
A3 | A5 | 3 | ||||
A3 | A1 | 3 | ||||
A3 | A5 | 3 | ||||
A5 | A4 | 4 | ||||
A5 | A6 | 4 |
[STEP2]
- RANK = 2인 행을 모두 추출 = Y2
- 원본 테이블 X에서 RANK = 2인 행을 모두 삭제
- Y2 테이블을 임시테이블로 저장하여 원본 테이블 X에서 Y2테이블의 CD2 중복을 제거 후 Y1테이블과 통합(UNION ALL)
STEP2 결과
Y2테이블 X 테이블
CD1 | CD2 | RANK | CD1 | CD2 | RANK | |
A2 | A1 | 2 | A3 | A5 | 3 | |
A2 | A4 | 2 | A3 | A5 | 3 | |
A5 | A6 | 4 |
Y1, Y2 통합한 테이블(Z)
새로 생성: Z - 최종 테이블의 모습으로 RANK = 3, 4 계속 쌓이는 것입니다.
CD1 | CD2 | RANK |
A1 | A2 | 1 |
A1 | A3 | 1 |
A2 | A1 | 2 |
A2 | A4 | 2 |
.
.
.
[STEP10000]
이런식으로 대략 1만번 수행해야 합니다.
RANK 가 1만 몇번까지 있어서요.
아니면 다른 방법이 있을것도 같습니다.
왜? rank2 인 A5 가 y2 가 아닌 x 에 남아 있죠?
단순 cd2 로 중복 제거하고 가장 rank 가 작은 걸 가져오면 되겟는데요?
WITH t AS ( SELECT 'A1' cd1, 'A2' cd2, 1 rank FROM dual UNION ALL SELECT 'A1', 'A3', 1 FROM dual UNION ALL SELECT 'A2', 'A1', 2 FROM dual UNION ALL SELECT 'A2', 'A4', 2 FROM dual UNION ALL SELECT 'A2', 'A5', 2 FROM dual UNION ALL SELECT 'A3', 'A1', 3 FROM dual UNION ALL SELECT 'A3', 'A5', 3 FROM dual UNION ALL SELECT 'A4', 'A2', 3 FROM dual UNION ALL SELECT 'A5', 'A3', 4 FROM dual UNION ALL SELECT 'A5', 'A4', 4 FROM dual UNION ALL SELECT 'A5', 'A5', 4 FROM dual UNION ALL SELECT 'A5', 'A3', 4 FROM dual ) SELECT * FROM (SELECT cd1, cd2, rank , ROW_NUMBER() OVER(PARTITION BY cd2 ORDER BY rank, cd1) rn FROM t ) WHERE rn = 1 ORDER BY rank, cd2 ;