【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量
要求:对于此问题,我们将至少有一个其他员工需要向他汇报的员工,视为一个经理。
编写一个解决方案来返回需要听取汇报的所有经理的 ID、名称、直接向该经理汇报的员工人数,以及这些员工的平均年龄,其中该平均年龄需要四舍五入到最接近的整数。
返回的结果集需要按照 employee_id 进行排序。
解题思路:
1、使用了内连接,将Employees表连接自身,通过employee_id和reports_to匹配,然后分组统计。
2、对于识别出的每一位经理 (E1),我们需要对他所有的下属 (E2) 进行聚合计算。
• COUNT(E2.employee_id):统计该经理名下有多少条汇报记录,即下属人数 (reports_count)。
• AVG(E2.age):计算这些下属年龄的平均值。
• ROUND(..., 0):将平均年龄四舍五入到整数。
3、分组和排序:
• GROUP BY E1.employee_id:确保所有的统计计算都是按每个经理单独进行的。
• ORDER BY E1.employee_id:按要求以 employee_id顺序返回结果。
代码:
sql
SELECT
E1.employee_id,
E1.name,
COUNT(E2.employee_id)AS reports_count,
ROUND(AVG(E2.age),0)AS average_age
FROM
Employees E1
JOIN
Employees E2
ON E1.employee_id = E2.reports_to
GROUP BY E1.employee_id
ORDER BY E1.employee_id
重点:
1、一开始我选择用左连接,通过employee_id和reports_to匹配,然后但是左连接会保留左表的所有记录,即所有经理,即使用户的代码中可能没有下属的员工也会被包括进来。
结果:
我想过加判断:使用 LEFT JOIN来匹配员工和他们的下属,然后通过过滤条件(reports_count = 0, average_age IS NULL)来移除那些不是经理的员工。
但是代码没有用内连接的简洁,性能也没有内连接高效。
代码:
sql
SELECT
E1.employee_id,
E1.name,
COUNT(E2.employee_id) AS reports_count,
ROUND(AVG(E2.age), 0) AS average_age
FROM
Employees E1
LEFT JOIN
Employees E2 ON E1.employee_id = E2.reports_to
GROUP BY
E1.employee_id, E1.name
HAVING
COUNT(E2.employee_id) > 0 AND AVG(E2.age) IS NOT NULL
ORDER BY
E1.employee_id;