sql server 2019之,查询每个部门薪酬前三名

sql server 2019之,查询每个部门薪酬前三名
最新回答
绝尘映雪

2024-01-04 11:04:14

在SQL Server 2019中,要查询每个部门薪酬前三名的员工,可以使用窗口函数DENSE_RANK()结合PARTITION BY和ORDER BY子句来实现。以下是完整的解决方案:

-- 创建临时表并插入示例数据DECLARE @employee AS TABLE( Id INT, [Name] VARCHAR(30), [Salary] INT, [DepartmentId] INT);INSERT @employee( [Id], [Name], [Salary], [DepartmentId])VALUES(1, 'Joe', 8500, 1),(2, 'Henry', 8000, 2),(3, 'Sam', 6000, 2),(4, 'Max', 9000, 1),(5, 'Janet', 6900, 1),(6, 'Randy', 8500, 1),(7, 'Will', 7000, 1);DECLARE @department AS TABLE( Id INT, [Name] VARCHAR(30));INSERT @department( [Id], [Name])VALUES(1, 'IT'),(2, 'Sales');-- 使用DENSE_RANK()窗口函数查询每个部门薪酬前三名的员工WITH RankedEmployees AS( SELECT e.Id, e.[Name] AS EmployeeName, e.Salary, e.DepartmentId, d.[Name] AS DepartmentName, DENSE_RANK() OVER (PARTITION BY e.DepartmentId ORDER BY e.Salary DESC) AS SalaryRank FROM @employee e INNER JOIN @department d ON e.DepartmentId = d.Id)SELECT Id, EmployeeName, Salary, DepartmentId, DepartmentNameFROM RankedEmployeesWHERE SalaryRank <= 3ORDER BY DepartmentId, SalaryRank;代码说明:
  1. 数据准备

    创建了两个临时表@employee和@department,并插入了示例数据。

    @employee表包含员工ID、姓名、薪资和部门ID。

    @department表包含部门ID和部门名称。

  2. 窗口函数应用

    使用DENSE_RANK()窗口函数对每个部门的员工按薪资降序排名。

    PARTITION BY e.DepartmentId确保排名是在每个部门内部独立计算的。

    ORDER BY e.Salary DESC指定按薪资降序排列。

  3. 结果筛选

    在外部查询中,通过WHERE SalaryRank <= 3筛选出每个部门薪资排名前三的员工。

    结果按部门ID和薪资排名排序,便于查看。

  4. 输出字段

    包括员工ID、姓名、薪资、部门ID和部门名称,便于理解结果。

注意事项:
  • 使用DENSE_RANK()而不是RANK()或ROW_NUMBER(),因为:

    DENSE_RANK()会给相同的薪资相同的排名,且不会跳过后续排名(例如,两个第一名后,下一个是第二名)。

    如果需要处理薪资相同的情况,DENSE_RANK()是更合适的选择。

  • 如果需要显示排名,可以在SELECT子句中包含SalaryRank字段。
预期结果:

对于给定的示例数据,查询结果将显示:

  • IT部门(DepartmentId = 1)的前三名高薪员工:Max(9000)、Joe和Randy(均为8500)、Will(7000)。
  • Sales部门(DepartmentId = 2)的前三名高薪员工:Henry(8000)、Sam(6000)。

此解决方案高效且易于理解,适用于SQL Server 2019及更高版本。