코딩 테스트 문제/LeetCode

[LeetCode] SQL 50 - 570. Managers with at Least 5 Direct Reports (MySQL)

J520 2024. 8. 6. 22:55

570. Managers with at Least 5 Direct Reports

 

문제 설명

- 테이블 명 : Employee

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
| department  | varchar |
| managerId   | int     |
+-------------+---------+


- 테이블 설명 :

id는 기본 키 입니다.
각 row는 직원의 이름, 부서, 관리자의 ID를 나타냅니다.
managerId가 null이면 직원에게 관리자가 없는 것입니다.
직원은 자기 자신의 관리자가 될 수는 없습니다.


- 문제 :

5명 이상의 부하 직원이 있는 관리자를 찾는 솔루션을 작성하세요.

순서 상관 없이 결과를 반환 합니다.

 

입출력 예시

Input: 
Employee table:
+-----+-------+------------+-----------+
| id  | name  | department | managerId |
+-----+-------+------------+-----------+
| 101 | John  | A          | null      |
| 102 | Dan   | A          | 101       |
| 103 | James | A          | 101       |
| 104 | Amy   | A          | 101       |
| 105 | Anne  | A          | 101       |
| 106 | Ron   | B          | 101       |
+-----+-------+------------+-----------+

Output: 
+------+
| name |
+------+
| John |
+------+

 

풀이

-- having 사용 runtime 388ms

select e1.name
from employee e1
join employee e2
on e1.id = e2.managerId
group by e1.id
having count(e2.managerId) >= 5
;

 

더보기

노트 (where 절과 having 절의 차이)

1. WHERE 절 :
그룹화나 집계가 발생하기 전 필터링. 개별 행에 대한 조건을 지정

ex) 부서 id가 10인 속한 직원을 필터링
SELECT employee_id, department_id
FROM employees
WHERE department_id = 10
;

2. HAVING 절 :
그룹화나 집계가 수행된 후 필터링. HAVING 절은 GROUP BY 절과 집계 함수가 계산된 전체에 대한 조건 지정

ex) 직원 수가 5명 이하인 부서를 필터링
SELECT department_id, COUNT(employee_id)
FROM employees
GROUP BY department_id
HAVING COUNT(employee_id) > 5
;

3. 주요 차이점
 3.1. 필터링 범위:
  - WHERE는 그룹화 및 집계 전 개별에 대한 필터링
  - HAVING은 그룹화 및 집계 후 전체에 대한 필터링

 3.2. 집계 함수
  - WHERE는 집계 함수 이전에 처리되므로 COUNT(), SUM() 등의 집계 함수를 사용할 수 없음
  - HAVING은 집계 함수와 함께 작동하도록 특별히 설계되었으며 해당 결과를 기반으로 필터링 할 수 있음

 

다른 풀이

-- 서브쿼리 사용 runtime 307ms

select name 
from Employee
where id in(
     select managerId
     from Employee
     group by managerId
     having count(*) >= 5
     )
;

 

출처 :

https://leetcode.com/problems/managers-with-at-least-5-direct-reports/description/?source=submission-noac