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 |