KEEP GOING

[MySQL] LeetCode : Department Top Three Salaries 본문

code review/sql

[MySQL] LeetCode : Department Top Three Salaries

jmHan 2022. 2. 4. 16:45
반응형

https://leetcode.com/problems/department-top-three-salaries/

 

Department Top Three Salaries - 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

 

 

1. 코드 구현 (CTE 사용)

WITH tmp AS(
SELECT id
       ,name
       ,salary
       ,departmentId
       ,DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC)AS 'dense_rank'
FROM Employee
)

SELECT D.name AS Department
       ,tmp.name AS Employee
       ,tmp.salary AS Salary
FROM tmp INNER JOIN Department D ON tmp.departmentId = D.id
WHERE dense_rank <= 3

임시테이블 tmp의 결과를 조회해보면 아래와 같다.

문제에서 부서별로 높은 봉급 3순위 안에 들어가는 직원의 이름, 부서, 봉급을 조회하길 원하고 있다.

DENSE_RANK를 사용하여 각 부서별로 봉급에 대해 순위를 부여해주었다. 이때 봉급이 높은 순으로 높은 순위를 부여하기 위해 ORDER BY 절에서 DESC(내림차순)을 추가하였다.

윈도우 함수인 DENSE_RANK는 동일한 값에 대해 같은 순위를 부여하고 순위를 빽빽하게 부여해준다. 이게 무슨 말이냐면 Max, Joe, Randy, Will, Janet은 departmetId 값이 1 즉, 모두 IT 부서의 직원들이다.

이때 Joe와 Randy의 봉급이 같기 때문에 둘다 2위가 되었는데 그 다음으로 봉급이 높은 Will은 3위가 된다. RANK()함수를 사용할 경우 2등이 2명이기 때문에 Randy는 4등이 된다. 하지만 DENSE_RANK()를 사용하면 이러한 부분을 개선하여 비어있는 숫자없이 순위를 부여받을 수 있다. 

 

 

 

 

 이후 SELECT 쿼리를 통해 임시테이블과 Department 테이블을 셀프 조인으로 묶어준 뒤, 순위가 1,2,3위를 부여받은 직원들의 부서명, 이름, 봉급을 구해주었다. 이 결과를 조회하면 아래와 같다. 

 

 

 

2. 코드 구현 (FROM절 서브쿼리)

SELECT t.department
      ,t.employee
      ,t.salary
FROM (
    SELECT department.name AS department
          ,employee.name AS employee
          ,employee.salary
          ,DENSE_RANK() OVER (PARTITION BY departmentid ORDER BY salary DESC) AS dr
    FROM employee
        INNER JOIN department ON employee.departmentid = department.id)t
WHERE t.dr <= 3
반응형
Comments