SQL大神带你飞 | 24春招京东SQL真题解析-每个部门薪资排名前两名员工
每个部门薪资排名前两名员工
https://www.nowcoder.com/practice/89329eadd4a64126b1cd326ea0b7eff7
最近做了京东的24年春招题,题目如下:
题目分析
表结构:
employees
表:包含以下字段:employee_id
:员工ID,主键。employee_name
:员工姓名。department
:员工所属部门。salary
:员工薪资。hire_date
:员工入职日期。
目标:
- 找出每个部门薪资排名前两名的员工信息。
输出要求:
- 按部门升序排列。
- 在同一部门内,按薪资降序排列。
知识点关键词
- 窗口函数:
RANK()
- 分组:
PARTITION BY
- 排序:
ORDER BY
解答步骤
1. 使用窗口函数计算每个部门的薪资排名
我们使用 RANK()
窗口函数来计算每个部门内员工的薪资排名。通过 PARTITION BY
子句按 department
分组,并按 salary
降序排列。
select department, employee_name, salary,
rank() over(partition by department order by salary desc) as rk
from employees
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rk
:计算每个部门内员工的薪资排名。
2. 筛选出每个部门薪资排名前两名的员工
我们通过 WHERE
子句筛选出薪资排名前两名的员工。
where rk <= 2
WHERE rk <= 2
:筛选出每个部门薪资排名前两名的员工。
3. 排序输出
我们按部门升序排列,并在同一部门内按薪资降序排列。
order by department asc, salary desc
ORDER BY department ASC, salary DESC
:按部门升序排列,在同一部门内按薪资降序排列。
完整代码
select department, employee_name, salary
from (
select department, employee_name, salary,
rank() over(partition by department order by salary desc) as rk
from employees
) sub
where rk <= 2
order by department asc, salary desc;
近似题目推荐
-
- 知识点:窗口函数、分组、排序
-
获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
- 知识点:窗口函数、分组、排序
-
给出employees表中排名为奇数行的first_name
- 知识点:聚合函数、分组、排序
这些题目都涉及到使用排序窗口函数(可以点击链接查看知识点)和分组操作来处理和分析数据,除却本题的rank()函数,还可以练习row_number()函数和dense_rank()函数的不同用法。