녕녀기의 실험일지

[ Oracle ] RANK() OVER를 사용해 정보가 많은 순으로 순위 매기기 본문

-- Data --/- SQL -

[ Oracle ] RANK() OVER를 사용해 정보가 많은 순으로 순위 매기기

녕녀기 2023. 6. 14. 16:17

본문으로

안녕하세요. 녀기입니다.

 

프로그래머스에서 sql 코딩 연습을 하다가

 

써 본 함수에 대해서 포스팅을 해볼까 합니다!!

 

들어가 보시죠~~

 


RANK() OVER

※ 문제 출처는 아래와 같습니다 ↓

https://school.programmers.co.kr/learn/courses/30/lessons/131124

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Column name Type Nullable
REVIEW_ID VARCHAR(10) FALSE
REST_ID VARCHAR(10) TRUE
MEMBER_ID VARCHAR(100) TRUE
REVIEW_SCORE NUMBER TRUE
REVIEW_TEXT VARCHAR(1000) TRUE
REVIEW_DATE DATE TRUE

 

위의 테이블을 살펴보면 게시판 데이터를 저장해 놓은 테이블입니다.

 

중간에 보이는 MEMBER_ID는 회원의 ID를 의미합니다.

 

RANK() OVER를 사용해 

 

게시물을 많이 작성한 MEMBER의 순서를 매겨보도록 합시다.

 

SELECT MEMBER_ID, RANK() OVER (ORDER BY COUNT(MEMBER_ID) DESC) AS rank
FROM REST_REVIEW
GROUP BY MEMBER_ID;

 

RANK() 함수를 사용해 순위를 매길 수 있고

 

OVER 절 안에는 정렬 순서에 따라 순위를 매길 수 있는 ORDER BY 절이 있습니다.

 

(파티션 별로 순위를 매기는 PARTITION BY 절을 추가할 수도 있지만 여기서는 다루지 않겠습니다.)

 

ORDER BY 절을 보면 MEMBER_ID의 수를 센 뒤, 내림차순 정렬합니다.

 

그러면 작성을 제일 많이 한 회원이 맨 위에 자리하게 됩니다.

 

그렇게 순위를 매기면

 

member_id rank
minjea985@naver.com 1
soso94@naver.com 1
ksjs1115@gmail.com 1
yelin92@gmail.com 4
min09125@naver.com 4
woojune96@naver.com 4
yoonsy94@gmail.com 4
yeseo92@naver.com 4
jihoo95@nate.com 4

 

위와 같이 순위가 매겨집니다.

 

1위가 세 명이네요.

 

세 사람의 게시글 작성 수가 공동 1위로 같다는 것입니다.

 

그 다음 4 번째로 작성 수가 많은 사람은 4위로 정해집니다.

 

중복 순위의 다음 순위는, 내림차순으로 했을 때 순위와 같아집니다. 

 

5 번째, 6 번째 등은 4위와 작성 수가 같기 때문에 4위로 정해집니다.


만약 여기서 RANK() 대신 DENSE_RANK()를 사용하면

member_id rank
minjea985@naver.com 1
soso94@naver.com 1
ksjs1115@gmail.com 1
yelin92@gmail.com 2
min09125@naver.com 2
woojune96@naver.com 2
yoonsy94@gmail.com 2
yeseo92@naver.com 2
jihoo95@nate.com 2

중복 순위의 다음 순위가 바로 이어지게 작성할 수 있습니다.


RANK()와 같은 순위는 주로 대회 같은 곳에서 사용하는 순위입니다.

 

점수 등이 같을 때 공동 순위를 내죠!

 

DENSE_RANK()의 경우에는 언제 사용하는지 모르겠네요....

 

만약 COUNT(MEMBER_ID)를 같이 출력하고, 그 갯수의 순위를 표시하고 싶을 때 유용할 수도 있다는 생각이 듭니다.

 

(유저들이 가장 많이 포스팅한 게시물의 갯수는 5개이고, 2 번째로 많은 수는 4개이다?

 

같은 느낌으로 사용하지 않을까 싶습니다.)

 

ROW_NUMBER()과 같이 출력된 행 자체에 순번을 매기는 함수도 있으니 알아두시면 좋을 것 같습니다!

 

그럼 저는 이만 사라져 볼게요~~

 

뿅!

Comments