확실히 개발자는 어떤 환경에 있는가에 따라 사용하는 기술의 숙련도가 달라지는 것 같다. 최근에는 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)
'지식 > 알고리즘' 카테고리의 다른 글
[LeetCode] 5. Longest Palindromic Substring [Java/Python3] (0) | 2022.09.10 |
---|---|
[LeetCode] 601. Human Traffic of Stadium [SQL] (1) | 2022.09.05 |