【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;
相关推荐
IT 小阿姨(数据库)1 小时前
PostgreSQL 之上的开源时序数据库 TimescaleDB 详解
运维·数据库·sql·postgresql·开源·centos·时序数据库
sadandbad2 小时前
[vulhub靶机通关]DC-2(rbash绕过_git提权)
网络·sql·web安全·网络安全
万事大吉CC3 小时前
SQL表设计与约束教程
数据库·sql
ANGLAL5 小时前
17.MyBatis动态SQL语法整理
java·sql·mybatis
llxxyy卢5 小时前
基于时间的 SQL 盲注-延时判断和基于布尔的 SQL 盲注
数据库·sql·oracle
小安同学iter6 小时前
SQL50+Hot100系列(11.7)
java·算法·leetcode·hot100·sql50
珊珊而川6 小时前
MAC-SQL:黄金标准错误
数据库·sql
谈笑也风生8 小时前
只出现一次的数字 II(一)
数据结构·算法·leetcode
aloha_7899 小时前
测试开发工程师面经准备(sxf)
java·python·leetcode·压力测试
im_AMBER9 小时前
Leetcode 47
数据结构·c++·笔记·学习·算法·leetcode