회사에서 운영중인 시스템중 요청 후 결재선을 선택하는 화면이 있는데 정상적으로 결재가 되지 않는다는 연락을 받았다.
데이타 :
ROWNUM | 승인자명
1 | 요청자 A
2 | 요청자 팀장
3 | 주관부서 B
4 | 주관부서 팀장
위 데이터에서 문제는 요청자 A의 팀장과 주관부서 팀장이 같은 경우에 결제승인 프로세스가 정상적으로 타지 않는다는 것이었다.
그래서 해결 방법으로는 요청자 팀장과 주관부서 승인자가 동일할시 중복결재가 되지 않도록 요청자 팀장의 결재라인을 지움으로서 동일인물에 대한 중복 결재를 없애는것 으로 설계하였다.
하지만 쿼리를 보니 주관부서와 요청자를 서브쿼리로 UNION하였고 ROWNUM은 하드코딩 되어있는 상태여서 DISTINCT나 GROUP BY를 할시 ROWNUM에 걸려 중복제거를 할 수 없는 상태였다.
그래서 문득 생각한게 특정 컬럼을 기준으로 중복제거를 할 수는 없을까? 였고 구글링한 결과 답은 나왔다.
ROW_NUMBER() OVER(PARTITION BY 승인자명 ORDER BY ROWNUM DESC) AS RN
Alias로 지정한 RN의 결과는
ROWNUM | 승인자명 | RN
1 | 요청자 A | 1
2 | 요청자 팀장 | 2
3 | 주관부서 B | 1
4 | 주관부서 팀장| 1
RN의 값을 받아 RN이 1인것만 WHERE절에서 조건을 주면 2번 요청자 팀장이 없어져 중복이 제거되는 효과를 볼 수 있었다.
중복제거에는 GROUP BY, DISTINCT도 있지만 특정 컬럼값으로 여의치 않을땐 PARTITION BY를 이용하자
'ORACLE SQL' 카테고리의 다른 글
오라클 시노님(Synonym)이란? (0) | 2023.08.21 |
---|---|
피벗 쿼리를 작성해보자 (PIVOT TABLE QUERY) (0) | 2023.07.31 |
ORACLE SELECT UPDATE 각각의 Key값에 각기 다른 값 SET 하기 (0) | 2023.07.11 |
ORACLE) SPLIT 함수 만들기 (0) | 2022.08.23 |
LISTAGG 문자열 연결의 결과가 너무 깁니다 에러 발생시 (0) | 2022.06.15 |