본문 바로가기

지식/알고리즘

[LeetCode] 185. Department Top Three Salaries [SQL]

확실히 개발자는 어떤 환경에 있는가에 따라 사용하는 기술의 숙련도가 달라지는 것 같다. 최근에는 SQL을 많이 사용하는 편이라 가끔씩은 알고리즘보다 더 재밌는 것 같다. 다만, SQL은 확실히 문제의 다양성이 부족해서 몇 번 풀다보면 반복되는 것 같다. 문제 수도 몇 개 없다...

185. Department Top Three Salaries

문제설명

  • 각 부서에서 Top3 고연봉자 뽑아내기
  • 조건
    • salary이 동일하면 공동 순위 (Ex. 1, 2, 2, 3)
    • 부서 중에는 3명이 안되는 경우도 있음

쿼리

SELECT d.name AS "Department", e1.name AS "Employee", e1.salary AS "Salary"
FROM employee e1, department d
WHERE (
    SELECT COUNT(DISTINCT(Salary)) 
    FROM employee e2
    WHERE e2.departmentId = e1.departmentId
    AND e2.salary > e1.salary
) < 3
    AND e1.departmentId = d.id

 

후기

확실히 이 문제의 포인트는 WHERE 절에 있는 것 같다. WHERE 절의 서브쿼리에서 서브쿼리 밖의 테이블인 e1을 이용해 salary의 순위를 알 수 있게 만들기 때문인데, 다음과 같은 로직을 보면서 천천히 생각해보면 좋을 것 같다.

+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 85000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
| 5  | Janet | 69000  | 1            |
| 6  | Randy | 85000  | 1            |
| 7  | Will  | 70000  | 1            |
+----+-------+--------+--------------+

DepartmentId가 1인 상황에서 salary가 85000, 90000, 69000, 85000, 70000 보다 큰 경우에, 카운트되는 SALARY는 각각 1, 0, 3, 1, 2이 되고 3 미만으로 거르게 되면 85000, 90000, 85000, 70000이 도출된다.  

체크포인트

  • WHERE / ON의 차이
    • WHERE 절: 조인 후 필터링, null이 포함된 대상 -> null이 아닌 대상으로 필터링
    • ON 절: 조인 전 필터링, outer join -> null 출력 가능
  • 서브쿼리의 종류
    • SELECT문 내 서브쿼리: 스칼라 서브쿼리(Scalar Subquery)
    • FROM절 내 서브쿼리: 인라인뷰(Inline View)
    • WHERE절 내 서브쿼리: 서브쿼리(Subquery)