본문 바로가기

SQL - Mysql & Oracle/SQL 실전 코딩 테스트

[Orcale] 리트코드(Leet Code) - Rank Scores 정답 해설(feat. Rank 함수)

반응형

리트코드 SQL 문제 중 Rank Scores 정답 누구나 알기 쉽게 해설해보고자 한다. 이 문제의 핵심은 바로 SQL에서 Rank와 dense rank 함수의 차이를 이해하고 적용하는 것인데, 개념부터 실전 코드까지 활용할 수 있도록 최대한 자세하게 안내해보고자 한다. 

 

목차

1. 리트코드 Rank Score 문제 기본 해설

2. Oracle의 Rank와 Dense Rank 함수 설명

3. Rank Score 코드 정답

 

 

리트코드 Rank Score 문제 기본 해설

 

리트코드는 문제의 양도 많고 질도 좋은데, 가장 어려움을 겪을 수 있는 부분이 바로 영어로 되어있다는 것이다. 여기서는 그 고민을 해결해주기 위해서 다 번역을 하고 문제의 핵심만 설명하고자 한다. (문제의 링크)

 

Rank Score의 문제 원본

 

  • 데이터셋의 기본 설명 - Score Table
    • Column1은 ID로 점수가 갖고 있는 고유의 ID를 말한다. 여기 문제에서는 활용할 일이 없다.
    • Column2는 score로 소숫점으로 이루어져 있고, 문제에서 핵심적으로 활용한 변수이다. 

 

  • 문제의 요구사항 핵심 정리
    • 첫 번째. 점수의 순위는 높은 순위에서 낮은 순위로 내림차순으로 정리되어야 한다.
    • 두 번째. 동점인 경우 같은 순위로 평가되어야 한다. 
    • 세 번째. 순위 간 순서에서 빈 숫자 없이, 연속적인 수가 되어야 한다.
      • 예를 들어, 공동 1등인 경우 다음 순위가 3위가 아닌 2위가 되어야 한다. 

 

 

 

 

Oracle의 Rank와 Dense Rank 함수 설명

 

rank와 dense rank함수의 차이를 아주 간단히 말하면, 중복 순위가 있을 때 어떻게 데이터를 처리하느냐에 있다. 기본적인 문법과 함께 어떻게 SQL문을 써야하는지 기본적인 안내를 해보도록 하겠다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
-- Rank 함수의 기본 문법
SELECT df1.column1 --  순위의 기준이 되는 Column
    , RANK() OVER ( ORDER BY [순위에 기준이 되는 Column] ASC|DESC ) as rank
FROM dataframe as df1
 
 
-- Dense Rank 함수의 기본 문법
SELECT df1.column1 --  순위의 기준이 되는 Column
    , DENSE_RANK() OVER ( ORDER BY [순위에 기준이 되는 Column] ASC|DESC ) as rank
FROM dataframe as df1
 
 
cs
  • Rank는 중복 순위 개수만큼 다음 순위를 건너뛰고 숫자를 부여한다.
  • Dense Rank는 중복에 상관 없이 순위가 빈 숫자 없이 순차적으로 숫자를 부여한다. 
  • 함수의 기본 문법
    • RANK() OVER ( Order by [column] 순서정렬) 
      • RANK() OVER ( )여기까지는 기본적인 사항이니 반드시 입력하도록 하자.
      • [Column] 자리에는 순위의 기준이 되는 값을 삽입하면 된다.
      • 순서정렬에는 ASC 혹은 DESC 값이 들어오면 된다. ASC는 오름차순 정렬이고, DESC는 내림차순 정렬이니 문제의 요구사항에 맞게 잘 활용하면 될 것이다. 

 

 

 

Rank Score 코드 정답

 

1
2
3
4
5
 
SELECT a.score as score
    , DENSE_RANK() OVER (ORDER BY a.score DESC) as rank
FROM scores a
ORDER BY 2 ASC
cs

 

  • 3번째 줄 코드 해설

문제의 요구사항 중에 세 번째가 이 문제 풀이의 핵심이다. 왜냐하면 중복 순위 간 빈 숫가 없어야 한다는 명백한 조건을 걸었기 때문이다. 이러한 문제의 요구사항을 만족하기 위해서 DENSE_RANK함수를 채택했다. 또한 DENSE_RANK 내에서 순위를 매길 때는 높은 점수가 높은 순위를 받아야 하기 때문에 내림차순 파라미터인 DESC로정했다.  

 

  • 5번째 줄 코드 해설

데이터를 뱉어낼 때 순위가 높은 순으로 정렬이 되어야 하기 때문에 ORDER BY 문이 필요했다. 숫자 2는 SELECT문에서 2번째 COLUMN을 기준으로 정렬을 하라는 의미이고, ASC는 오름차순으로 정렬하는 명령어이다. 

 

 

이렇게 문제를 풀면 단순히 정답만 맞추는 것이 아니라 코드 개념부터 실력까지 모두 챙길 수 있을 것이라 확신한다. 

 

 

반응형