취미가 좋다
178. Rank Scores 본문
https://leetcode.com/problems/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
Solution
SELECT Score, @rank := @rank + (@pre <> (@pre := Score)) 'Rank'
FROM Scores, (SELECT @rank := 0, @pre := -1) init
ORDER BY Score desc
- 릿코드에서는 SET으로 변수 선언이 왜인지 안된다.
- FROM에 있는 서브쿼리로 변수를 만들어서 사용한다.
- <> 는 != 과 같은 의미이다. 같지 않으면 True를 반환한다.
- := 는 대입 연산자이고 = 는 비교 연산자이다.
- @rank를 가져오는데, 연산 후의 결과를 가져온다.
- 먼저 @pre와 Score를 넣은 @pre와 비교한다. 즉, 이전 Score와 현재 Score를 비교해서 다르면 1을 더한다.
- Rank라는 이름은 SQL에서 함수로 쓰이므로, 따옴표 ' 를 꼭 써야한다. 안그러면 에러가 발생한다.
SELECT Score, (SELECT count(*)
FROM (SELECT distinct Score s FROM Scores) temp
WHERE s >= Score) 'Rank'
FROM Scores
ORDER BY Score DESC
- 서브쿼리에서 'Rank'를 계산한다.
- 먼저 중복되는 Score를 제거한 temp라는 테이블을 만든다.
- 거기서 각 Score별로 자신보다 큰 값의 갯수를 count한다.
SELECT Score, DENSE_RANK() OVER(ORDER BY Score DESC) 'Rank'
FROM Scores
ORDER BY 'Rank'
- DENSE_RANK 함수로 Score의 순위를 매긴다.
- 그리고 전체 결과를 'Rank'로 정렬한다.
RANK( ) / DENSE_RANK( ) / ROW_NUMBER( )
모두 순위를 매겨주는 SQL 함수들이다.
RANK 함수는 중복 값들에 대해서 동일 순위로 표시하고, 중복 순위 다음 값에 대해서는 중복 개수만큼 떨어진 순위로 출력하도록 하는 함수이다.
예를 들어, 1 -> 2 -> 2 -> 4
DENSE_RANK 함수는 중복 값들에 대해서 동일 순위로 표시하고, 중복 순위 다음 값에 대해서는 중복 값 개수와 상관없이 순차적인 순위 값을 출력하도록 하는 함수이다.
예를 들어, 1 -> 2 -> 2 -> 3
ROW_NUMBER 함수는 중복 값들에 대해서도 순차적인 순위를 표시하도록 출력하는 함수 입니다.
예를 들어, 1 -> 2 -> 3 -> 4
작성은 RANK 함수 다음에 OVER 이 따라오고 그 뒤 괄호 안에는 순위를 매길 정렬 기준을 작성한다.
'SQL 문제풀이 > Leetcode' 카테고리의 다른 글
180. Consecutive Numbers (0) | 2021.09.29 |
---|---|
182. Duplicate Emails (0) | 2021.09.04 |
181. Employees Earning More Than Their Managers (0) | 2021.09.04 |
177. Nth Highest Salary (0) | 2021.08.13 |
176. Second Highest Salary (0) | 2021.08.13 |
Comments