문제. 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
나의 풀이 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() 함수는 알아두면 편할 것 같습니다.
반응형
'Tests > Leetcode' 카테고리의 다른 글
[leetcode] MySQL > 180. Consecutive Numbers (0) | 2020.09.14 |
---|---|
[leetcode] MySQL > 183. Customers Who Never Order (0) | 2020.09.12 |
[leetcode] MySQL > 185. Department Top Three Salaries (0) | 2020.09.11 |
[leetcode] 177. Nth Highest Salary (MySQL) (0) | 2020.09.10 |
[leetcode] MySQL > 184. Department Highest Salary (0) | 2020.09.08 |
댓글