(수정)순위 중복 시 어떻게 처리 해야하나요? 0 7 1,162

by arz3390 [SQL Query] [2016.04.29 16:49:41]


제목 없음.png (51,899Bytes)

안녕하세요. 어제도 글을 남겼었지만 오늘도 글을 남겨봅니다.

마농님이 올려두신 rank()함수, row_number()함수 등 분석 함수를 사용하지 않고

순위를 구하는 방법에 대해서 공부하고있습니다.

 

하다보니 궁금한 점이 rank함수를 쓰지 않고 순위를 구하는 건 좋은데

순위가 중복이 될 경우에는 어떻게 처리를 해야 할 지 모르곘습니다.

도움 부탁드립니다.

---- 수정 -----

마농님이 올리신 게시글 주소입니다.

http://www.gurubee.net/lecture/2192

셀프 조인, 서브쿼리 등을 이용해서 작성하셨네요. 이렇게 작성시 순위의 중복을 어떻게 해결할 수 있는지 알려주시면 좋겠습니다.

-- 수정 --

첨부파일 보시면 RK_DEPT에 부서별 순위를 설정해 주셨는데 밑에 보면 중복되는 등수가 있습니다.

부서도 같고 점수도 같아 부서별 등수가 똑같이 1등이 됬는데 그 부분을 1 1 3에서 1 2 3으로 바꾸고 싶습니다.

 

by 부쉬맨 [2016.04.29 17:40:27]

dense_rank() 사용하시면되요.


by arz3390 [2016.04.29 17:46:42]

dense_rank()도... 분석 함수에 포합되지 않나요?


by 부쉬맨 [2016.04.29 18:02:55]

방법이야 여러개잇겟지만

데이터의 어떠한 기준으로 순위를 측정할것인가부터 생각해봐야되서..

모호할수있겟네요.


by 마농 [2016.04.29 19:30:42]
순위 중복 해결 이라는 모호한 표현으로 질문하셨네요?
순위 중복 해결의 정확한 의미를 알려주세요.

by arz3390 [2016.04.29 21:17:45]

글 수정했습니다.


by 마농 [2016.05.02 09:24:56]

순위함수는 크게 다음 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
;

 


by arz3390 [2016.05.02 09:52:09]

답변 정말 감사합니다!

머리 속에서는 대략 적인 구상이 잡히는데 왜 실제로 하면 저렇게 작성이 안될까요 ㅠ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입