经典sql题(五)查找各部门工资前三的员工

上一章讲解了如何使用四个不同的窗口函数:RANK(), DENSE_RANK(), ROW_NUMBER(), 和 PERCENT_RANK() 求成绩前三的学生,本文将展示不使用窗口函数的情况下通过 SQL 查询来查找每个部门中工资排名前三的员工。

示例数据

假设我们的 Employee 表和 Department 表有以下数据:

Employee 表

IdNameSalaryDepartmentId
1Alice30001
2Bob40001
3Carol20001
4Dave50002
5Eve45002
6Frank42002

Department 表

IdName
1HR
2Engineering

第一步:为每个员工的工资生成排名

我们首先需要为每个部门员工的工资生成一个排名,以便后续筛选。可以使用以下 SQL 查询:

SELECT 
    e.Id,
    e.Name AS Employee,
    e.Salary,
    e.DepartmentId,
    DENSE_RANK() OVER (PARTITION BY e.DepartmentId ORDER BY e.Salary DESC) AS Rank
FROM 
    Employee AS e;
结果(子查询结果)
IdEmployeeSalaryDepartmentIdRank
2Bob400011
1Alice300012
3Carol200013
4Dave500021
5Eve450022
6Frank420023
解析
  • DENSE_RANK() 函数为每个部门的员工生成工资排名,工资高的排名小。
  • PARTITION BY e.DepartmentId 表示我们按照部门进行分区。
  • ORDER BY e.Salary DESC 指定按照工资降序排列。

第二步:筛选出每个部门工资不高于第三的员工

接下来,我们将通过外层查询筛选出排名不高于 3 的记录:

SELECT 
    d.Name AS Department,
    ranked.Employee,
    ranked.Salary
FROM (
    SELECT 
        e.Name AS Employee,
        e.Salary,
        e.DepartmentId,
        DENSE_RANK() OVER (PARTITION BY e.DepartmentId ORDER BY e.Salary DESC) AS Rank
    FROM 
        Employee AS e
) AS ranked
JOIN Department AS d ON ranked.DepartmentId = d.Id
WHERE ranked.Rank <= 3
ORDER BY ranked.DepartmentId ASC, ranked.Salary DESC;
结果(最终结果)
DepartmentEmployeeSalary
HRBob4000
HRAlice3000
HRCarol2000
EngineeringDave5000
EngineeringEve4500
EngineeringFrank4200
解析
  • 在外层查询中,我们只保留排名不高于 3 的记录,这样就得到了每个部门中工资排名前几名的员工。
  • 通过连接 Department 表获取部门名称,并按部门和工资排序。

完整步骤解析

  1. 生成工资排名

    • 查询:为每个部门的员工工资生成排名,以便后续筛选。
    • 结果表:显示员工的工资、部门及其对应的排名。
  2. 筛选工资排名不高于第三的员工

    • 查询:在生成的排名中筛选出排名不高于 3 的记录。
    • 最终结果:展示符合条件的员工和其所属部门。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值