오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-09 00:00
관리 메뉴

우노

[Window Function] LeetCode 185번 “Department Top Three Salaries” 풀이 본문

SQL/Window Function

[Window Function] LeetCode 185번 “Department Top Three Salaries” 풀이

운호(Noah) 2022. 12. 11. 20:47

문제 링크

풀이

  • 부서 별 급여 3순위에 드는 사원들을 출력하면 되는 문제입니다.

  • Window Function의 DENSE_RANK와 JOIN을 사용해 해결할 수 있습니다.

  • DENSE_RANK()는, 동일값인 경우엔 동일 순위를 부여하고, 이후 순위를 연이어서 부여하는 기능입니다.

    • 1 2 2 3
  • 먼저, 아래와 같은 서브쿼리를 작성합니다.

      SELECT id, name, salary, departmentId, 
              DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC) AS salary_rank
      FROM Employee
      | id | name  | salary | departmentId | salary_rank |
      | -- | ----- | ------ | ------------ | ----------- |
      | 4  | Max   | 90000  | 1            | 1           |
      | 1  | Joe   | 85000  | 1            | 2           |
      | 6  | Randy | 85000  | 1            | 2           |
      | 7  | Will  | 70000  | 1            | 3           |
      | 5  | Janet | 69000  | 1            | 4           |
      | 2  | Henry | 80000  | 2            | 1           |
      | 3  | Sam   | 60000  | 2            | 2           |
  • 이후, 해당 서브쿼리 테이블과 Department를 JOIN한 뒤,

  • WHERE을 통해 salary_rank가 3 이하인 데이터들을 걸러내면 됩니다.

  • 전체 쿼리는 아래와 같습니다.

전체 쿼리

SELECT D.name AS Department, SUB.name AS Employee, SUB.salary AS Salary
FROM (
SELECT id, name, salary, departmentId, 
        DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC) AS salary_rank
FROM Employee) SUB
JOIN Department AS D
ON SUB.departmentId = D.id
WHERE SUB.salary_rank <= 3
Comments