풀이
•
매니저
◦
적어도 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 테이블의 행 수
◦
이는 쿼리가 각 행을 한 번씩 처리하여 각 매니저에 직접 보고하는 직원 수를 찾기 때문
정답은 맞지만 참 안 좋은 쿼리 같아서 윈도우 함수를 사용해보려했지만, 잘 안풀렸다…
정답 케이스를 찾아보니 다른 풀이들도 셀프 조인을 사용한 것을 확인해볼 수 있었다