안녕하세요. 어제도 글을 남겼었지만 오늘도 글을 남겨봅니다.
마농님이 올려두신 rank()함수, row_number()함수 등 분석 함수를 사용하지 않고
순위를 구하는 방법에 대해서 공부하고있습니다.
하다보니 궁금한 점이 rank함수를 쓰지 않고 순위를 구하는 건 좋은데
순위가 중복이 될 경우에는 어떻게 처리를 해야 할 지 모르곘습니다.
도움 부탁드립니다.
---- 수정 -----
마농님이 올리신 게시글 주소입니다.
http://www.gurubee.net/lecture/2192
셀프 조인, 서브쿼리 등을 이용해서 작성하셨네요. 이렇게 작성시 순위의 중복을 어떻게 해결할 수 있는지 알려주시면 좋겠습니다.
-- 수정 --
첨부파일 보시면 RK_DEPT에 부서별 순위를 설정해 주셨는데 밑에 보면 중복되는 등수가 있습니다.
부서도 같고 점수도 같아 부서별 등수가 똑같이 1등이 됬는데 그 부분을 1 1 3에서 1 2 3으로 바꾸고 싶습니다.
순위함수는 크게 다음 3가지가 있습니다.
1. RANK : 동순위 존재, 동순위 다음 순서 건너뜀 (1, 1, 3)
2. DENSE_RANK : 동순위 존재, 동순위 다음 순서 안 건너뜀 (1, 1, 2)
3. ROW_NUMBER : 동순위 없음(1, 2, 3)
3번을 원하시는 거네요.
이 경우 점수 가 크다 조건 외에 유일값 조건을 추가해 줘야 합니다.(예 : empno)
여러 랭킹을 함께 조회할면 복잡하니 일단 1가지만 적용해 볼께요.
또한 오라클 버전 8.0 기준이 아닌 이후 버전 용 쿼리(CASE 문 사용)로 답변 합니다.
기타 다른 추가 요구사항이 있다면 추가 질문 해주세요.
WITH test_rank AS ( SELECT 1 empno, 10 deptno, 100 point FROM dual UNION ALL SELECT 2, 10, 90 FROM dual UNION ALL SELECT 3, 10, 80 FROM dual UNION ALL SELECT 4, 20, 100 FROM dual UNION ALL SELECT 5, 20, 90 FROM dual UNION ALL SELECT 6, 20, 80 FROM dual UNION ALL SELECT 7, 30, 95 FROM dual UNION ALL SELECT 8, 30, 85 FROM dual UNION ALL SELECT 9, 30, 95 FROM dual ) SELECT a.empno , a.deptno , a.point , COUNT(CASE WHEN a.point < b.point THEN 1 WHEN a.point = b.point AND a.empno > b.empno THEN 1 END) + 1 rn_dept FROM test_rank a , test_rank b WHERE a.deptno = b.deptno(+) AND a.point <= b.point(+) GROUP BY a.empno, a.deptno, a.point ORDER BY deptno, rn_dept ;