Search

1731. The Number of Employees Which Report to Each Employee

풀이

매니저
적어도 1명의 다른 직원이 그들에게 보고하는 직원.
각 매니저에게 직접 보고하는 직원 수와 그 직원들의 평균 연령(반올림)을 찾아야 합니다.

풀이

Input: Employees table: +-------------+---------+------------+-----+ | employee_id | name | reports_to | age | +-------------+---------+------------+-----+ | 9 | Hercy | null | 43 | | 6 | Alice | 9 | 41 | | 4 | Bob | 9 | 36 | | 2 | Winston | null | 37 | +-------------+---------+------------+-----+ Output: +-------------+-------+---------------+-------------+ | employee_id | name | reports_count | average_age | +-------------+-------+---------------+-------------+ | 9 | Hercy | 2 | 39 | +-------------+-------+---------------+-------------+
SQL
복사
Employees 테이블에 대해서 셀프 조인을 해야한다
FROM Employees AS e1 JOIN Employees AS e2 ON e1.employee_id = e2.reports_to | employee_id | name | reporter | reporter_age | | ----------- | ----- | -------- | ------------ | | 9 | Hercy | 6 | 41 | | 9 | Hercy | 4 | 36 |
SQL
복사
이렇게 되면 reports_to가 null인 경우는 누락된다
이후, manager employee_id 별로 reporter가 몇 명인지, reporter_age의 평균을 구해야한다
이를 위해 manager employee_id 기준으로 Group by를 사용한다
SELECT e1.employee_id AS employee_id, e1.name AS name, COUNT(e2.employee_id) AS reports_count, ROUND(AVG(e2.age)) AS average_age FROM Employees AS e1 JOIN Employees AS e2 ON e1.employee_id = e2.reports_to GROUP BY e1.employee_id ORDER BY e1.employee_id ASC ;
SQL
복사
Time complexity: O(n)
n 테이블의 행 수
이는 쿼리가 각 행을 한 번씩 처리하여 각 매니저에 직접 보고하는 직원 수를 찾기 때문
정답은 맞지만 참 안 좋은 쿼리 같아서 윈도우 함수를 사용해보려했지만, 잘 안풀렸다…
정답 케이스를 찾아보니 다른 풀이들도 셀프 조인을 사용한 것을 확인해볼 수 있었다