[리트코드 문제풀이]185번_연봉 탑쓰리를 찾아라!

김규리 (데이터분석가)·2022년 10월 2일
0

SQL 학습 시리즈

목록 보기
3/6

클릭 >> 리트코드 문제 링크

1차 시도

SELECT department.name
    ,employee.name
    ,employee.salary
    ,RANK() OVER (PARTITION BY department.name ORDER BY Salary DESC) AS rank
FROM employee
    INNER JOIN Department ON Employee.departmentId = Department.id

아래는 1차 시도의 결과인데, 오답이다.
["IT", "Janet", 69000, 5] 가 없는 결과가 나왔어야 한다.

["name", "name", "salary", "rank"], 
[["IT", "Max", 90000, 1], 
["IT", "Joe", 85000, 2], 
["IT", "Randy", 85000, 2], 
["IT", "Will", 70000, 4], 
["IT", "Janet", 69000, 5], 
["Sales", "Henry", 80000, 1], 
["Sales", "Sam", 60000, 2]]}

틀린 이유는?
윈도우 함수 선택을 잘못했다.
RANK()가 아니라 DENSE_RANK() 로 써야함.


잠시, RANK()와 DENSE_RANK() 의 차이점은?
같은 점수가 나왔을 때 순위매기는 방식이 다름.

RANK() : 공동1위(2명), 3위, 4위(3명), 7위
DENSE_RANK() : 공동1위(2명), 2위, 3위(3명), 4위.

DENSE 의 뜻을 보면 이해가 쉬움.
더 빽빽, 촘촘, 밀도있게 순위를 줬다는 뜻!


2차 시도 : 성공!

SELECT Department
    ,Employee
    ,Salary
FROM (
        SELECT department.name AS Department 
            ,employee.name AS Employee 
            ,employee.salary AS Salary 
            ,DENSE_RANK() OVER (PARTITION BY department.name ORDER BY Salary DESC) AS dense_rank
        FROM employee
            INNER JOIN Department ON Employee.departmentId = Department.id) AS rank_table
WHERE rank_table.dense_rank <= 3

배운 것

  • PARTITION BY 와 ORDER BY 순서 뒤집히면 안된다. P - O 순임.
  • RANK() 와 DENCE_RANK() 의 차이 잘 확인해서 쓰자.
profile
온라인 스토어 1인 창업가 출신 데이터 분석가

0개의 댓글