데이터베이스/SQL

178. Rank Scores

칼퇴시켜주세요 2023. 1. 5. 18:26
728x90

MYSQL의 다양한 순위 함수 중 RANK()에 대해 연습해 볼수 있는 괜찮은 문제이다. 학부과정에서 다양한 고급 함수를 배우기 보다는 기본 SQL을 배우다보니 문제를 보는 순간 풀이가 바로 떠오르지 않았다.

 

프로그래밍이라면 IF - ELSE 를 사용하여 rank를 구할수 있겠지만 SQL문에서 IF - ELSE 사용은 많이 사용해본적이 없어 자신이 없었다. 문득 혹시 내장 함수중에 rank를 구해주는 함수가 있지 않을까 찾아보니 역시나.... 모르는게 너무 많은것 같다.

 

우선 기본적으로 MYSQL에서 다양한 순위함수(분석함수)를 제공해준다. 

더보기

<순위함수>

PARTITION BY : 동일 그룹으로 묶어줄 칼럼 명 지정

ORDER BY : Partition 정의에 지정된 컬럼에 대한 정렬 수행

SELECT
<순위함수이름> (arguments)
OVER ([PARTITION BY <partion_by_list>]
ORDER BY <order_by_list>)
FROM 테이블명;

종류

NTILE() : PARTITION을 지정된 수 만큼의 등급으로 나누어 각 등급 번호를 출력
RANK() : 순위 값 중 동등 순위 번호는 같게 나오고  다음 순위를 다음 번호를 뺀 그 다음 값을 출력
DENSE_RANK() : 순위 값 중 동등 순위 번호는 같게 나오고 그 다음 순위를 다음 번호로 출력
ROW_NUMBER() : 동등 순위를 인식하지 않고 매번증가되는 번호를 출력
LEAD(expr [,offset] [,default]) / LAG() : 지정된 칼럼의 이전, 이후의 행 값을 출력
FIRST_VALUE() / LAST_VALUE() : 각 그룹별 첫 번째와 마지막값 하나만출력
CUME_DIST() : 주어진 그룹에 대한 상대적인 누적분포도 값을 반환한다.
분포도 값(비율)이므로 반환 값의 범위는 0 초
과 1이하 사이의 값을 반환한다.

 

이 문제는 DENSE_RANK()를 사용하면 쉽게 해결할 수 있다.

SELECT score, DENSE_RANK() OVER(ORDER BY score DESC) "rank"
FROM Scores
반응형

'데이터베이스 > SQL' 카테고리의 다른 글

181. Employees Earning More Than Their Managers  (0) 2023.01.05
1527. Patients With a Condition  (0) 2022.12.07
1484. Group Sold Products By The Date  (1) 2022.12.06
1667. Fix Names in a Table  (0) 2022.12.05
196. Delete Duplicate Emails  (0) 2022.12.05