본문 바로가기
Tests/Leetcode

[leetcode] MySQL > 178. Rank Scores

by 코딩하는 금융인 2020. 9. 9.

문제. 178. Rank Scores


SQL Schema & Explantion

Write a SQL query to rank scores. 
If there is a tie between two scores, both should have the same ranking.
Note that after a tie, the next ranking number should be the next consecutive integer value.
In other words, there should be no "holes" between ranks.

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

For example, given the above Scores table,
your query should generate the following report (order by highest score):

+-------+---------+
| score | Rank    |
+-------+---------+
| 4.00  | 1       |
| 4.00  | 1       |
| 3.85  | 2       |
| 3.65  | 3       |
| 3.65  | 3       |
| 3.50  | 4       |
+-------+---------+

 

Important Note: For MySQL solutions, to escape reserved words used as column names, you can use an apostrophe before and after the keyword. For example `Rank`.

 

출처 : Leetcode SQL 178. Rank Scores

 

Rank Scores - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


나의 풀이 in Mysql

# Write your MySQL query statement below
SELECT Score,
DENSE_RANK() OVER (ORDER BY Score DESC) AS 'Rank'
FROM Scores

원래 MySQL의 경우, Rank 함수를 지원하지 않아 variable를 이용하여 순위를 매겨야 합니다. 하지만, 8.0 버전부터 rank 함수를 지원하므로 DENSE_RANK() 함수를 이용하면 동일 값에 대한 순위를 매길 수 있습니다.

 

#버전이 낮을 경우 (Rank 함수를 이용하지 못할 경우)

SELECT score, Rank
FROM (SELECT score,
     CASE
     WHEN @pv = score THEN @vrank
     WHEN @pv := score THEN @vrank := @vrank +1
     END AS Rank
FROM scores as s, (SELECT @vrank :=0, @pv := NULL) as r
ORDER BY score DESC) as sc

동일 값의 경우, 같은 순위를 매겨야 하므로 두 가지 변수를 활용하여 풀었습니다.

score의 값으로 내림차순 후, score의 값이 같은 때는 동일 rank, 바뀔 때는 rank+1을 해주는 서브쿼리를 이용했습니다.

 

간단하게 풀 수 있는 방법이 가장 좋은 방법이므로 DENSE_RANK() 함수는 알아두면 편할 것 같습니다.

반응형

댓글