취미가 좋다

178. Rank Scores 본문

SQL 문제풀이/Leetcode

178. Rank Scores

benlee73 2021. 9. 6. 18:32

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