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;代码说明:数据准备:
创建了两个临时表@employee和@department,并插入了示例数据。
@employee表包含员工ID、姓名、薪资和部门ID。
@department表包含部门ID和部门名称。
窗口函数应用:
使用DENSE_RANK()窗口函数对每个部门的员工按薪资降序排名。
PARTITION BY e.DepartmentId确保排名是在每个部门内部独立计算的。
ORDER BY e.Salary DESC指定按薪资降序排列。
结果筛选:
在外部查询中,通过WHERE SalaryRank <= 3筛选出每个部门薪资排名前三的员工。
结果按部门ID和薪资排名排序,便于查看。
输出字段:
包括员工ID、姓名、薪资、部门ID和部门名称,便于理解结果。
DENSE_RANK()会给相同的薪资相同的排名,且不会跳过后续排名(例如,两个第一名后,下一个是第二名)。
如果需要处理薪资相同的情况,DENSE_RANK()是更合适的选择。
对于给定的示例数据,查询结果将显示:
此解决方案高效且易于理解,适用于SQL Server 2019及更高版本。