일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Kaggle
- Ga
- 데이터 분석
- 통계
- 상관계수
- SQLD
- Python
- segmentation
- 맞춤 이벤트
- git
- API
- Google Analytics
- 용어 정리
- It
- 그로스해킹
- 후기
- Ecommerce
- sql 개발자
- pandas
- DISTINCT
- 크로스셀링
- bigquery
- Funnel
- tableau
- 맞춤 자바스크립트
- SQL
- tablueau
- 이벤트 매개변수
- 캐글
- oracle
- Today
- Total
녕녀기의 실험일지
[ Oracle ] RANK() OVER를 사용해 정보가 많은 순으로 순위 매기기 본문
본문으로
안녕하세요. 녀기입니다.
프로그래머스에서 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()과 같이 출력된 행 자체에 순번을 매기는 함수도 있으니 알아두시면 좋을 것 같습니다!
그럼 저는 이만 사라져 볼게요~~
뿅!

'-- Data -- > - SQL -' 카테고리의 다른 글
[ Oracle ] 프로그래머스 코테 DISTINCT, COUNT, 상품을 구매한 회원 구하기 (0) | 2023.08.11 |
---|---|
[ Oracle ] 프로그래머스 코테 GROUP BY, 카테고리 별 도서 판매량 집계하기 (0) | 2023.06.30 |
[ Oracle ] TRUNC() 함수를 이용한 숫자 GROUPING (0) | 2023.06.09 |
[ Oracle ] COUNT() 함수를 이용한 집계 (0) | 2023.06.01 |
[ SQL ] 48회 SQLD(SQL 개발자) 시험 후기 (0) | 2023.04.12 |