【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量

【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;
相关推荐
歪歪1001 天前
如何在SQLite中实现事务处理?
java·开发语言·jvm·数据库·sql·sqlite
博睿谷IT99_1 天前
SQL SELECT 语句怎么用?COMPANY 表查询案例(含条件 / 模糊 / 分页)
数据库·sql·mysql
235161 天前
【LeetCode】3. 无重复字符的最长子串
java·后端·算法·leetcode·职场和发展
没有bug.的程序员1 天前
SQL 执行计划解析:从 EXPLAIN 到性能优化的完整指南
java·数据库·sql·性能优化·explain·执行计划
微笑尅乐1 天前
神奇的位运算——力扣136.只出现一次的数字
java·算法·leetcode·职场和发展
小心草里有鬼1 天前
Linux 数据库 Mysql8 主从复制
linux·运维·数据库·sql·mysql
自信的小螺丝钉1 天前
Leetcode 155. 最小栈 辅助栈
leetcode·
吃着火锅x唱着歌1 天前
LeetCode 3105.最长的严格递增或递减子数组
算法·leetcode·职场和发展
笨蛋少年派1 天前
SQL查询基础常用攻略
sql
boy快快长大1 天前
@Transactional 事务注解
数据库·sql·oracle