最近做了京东的24年春招题,题目如下:
题目分析
本题要求统计2024年上半年(2024-01-01 至 2024-07-01)启动的每个项目组内,员工的绩效分数及其在项目组内的排名,并输出员工ID、姓名、绩效分数、项目组内排名、部门和项目组名称。
输出字段:
- employee_id(员工ID)
- employee_name(员工姓名)
- first_half_2024_score(2024年上半年绩效分数)
- project_group_rank(项目组内绩效排名,分数高者优先,分数相同按员工ID升序)
- department(部门)
- project_group(项目组名称)
输出顺序:
- 先按项目ID升序(p.project_id)
- 再按项目组内排名升序(project_group_rank)
- 最后按员工ID升序(e.employee_id)
涉及知识点:
- SQL 多表连接(JOIN)
- 条件筛选(WHERE)
- 窗口函数(ROW_NUMBER() OVER PARTITION BY ... ORDER BY ...)
- 字段别名与排序(ORDER BY)
解答步骤
1. 关联员工、绩效和项目表
- 用
performance
绩效表与employees
员工表通过员工ID连接,获取员工信息。 - 再与
projects
项目表通过项目ID连接,获取项目名称。
from performance pe
join employees e on e.employee_id = pe.employee_id
join projects p on p.project_id = pe.project_id
2. 筛选2024年上半年启动的项目
- 只保留项目启动时间在2024-01-01至2024-07-01之间的项目。
where p.start_date between '2024-01-01' and '2024-07-01'
3. 计算项目组内绩效排名
- 用窗口函数
row_number() over(partition by p.project_id order by pe.performance_score desc, e.employee_id)
,在每个项目组内按绩效分数降序排名,分数相同则员工ID小的排前。
row_number() over(partition by p.project_id order by pe.performance_score desc, e.employee_id) as project_group_rank
4. 输出与排序
- 输出员工ID、姓名、绩效分数、项目组内排名、部门、项目组名称。
- 按项目ID、项目组内排名、员工ID排序。
order by p.project_id, project_group_rank, e.employee_id
完整代码
select e.employee_id, e.employee_name,
pe.performance_score as first_half_2024_score,
row_number() over(partition by p.project_id order by pe.performance_score desc, e.employee_id) as project_group_rank,
e.department,
p.project_name as project_group
from performance pe
join employees e on e.employee_id = pe.employee_id
join projects p on p.project_id = pe.project_id
where p.start_date between '2024-01-01' and '2024-07-01'
order by p.project_id, project_group_rank, e.employee_id
近似题目练习推荐
- 知识点:窗口函数、分组排名、JOIN
- 知识点:窗口函数、分组、排序
- 知识点:窗口函数、分组、排序
如需更多类似题目,可在牛客网SQL练习区进行练习。