KEEP GOING
[MySQL] LeetCode : Department Top Three Salaries 본문
반응형
https://leetcode.com/problems/department-top-three-salaries/
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
반응형
'code review > sql' 카테고리의 다른 글
[MySQL] 정규 표현식 정리(REGEXP) (0) | 2022.02.09 |
---|---|
[MySQL] LeetCode : Consecutive-Numbers (0) | 2022.02.07 |
[MySQL] HackerRank : Challenges (0) | 2022.02.02 |
[python] LeetCode : zigzag-conversion (ceil(), join()) (0) | 2022.02.02 |
[MySQL] LeetCode : Department Highest Salary Solution (0) | 2022.01.28 |
Comments