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
)
;
출처 :
'코딩 테스트 문제 > LeetCode' 카테고리의 다른 글
[LeetCode] SQL 50 - 1934. Confirmation Rate (MySQL) (0) | 2024.08.07 |
---|---|
[LeetCode] SQL 50 - 1280. Students and Examinations (MySQL) (0) | 2024.07.26 |
[LeetCode] SQL 50 - 1661. Average Time of Process per Machine (MySQL) (0) | 2024.07.26 |
[LeetCode] SQL 50 - 197. Rising Temperature (MySQL) (0) | 2024.07.25 |