Ash*_*pta 3 sql sql-server logic
我有一张桌子: [tblEmp]
EmpId | EmpName | DeptId
Run Code Online (Sandbox Code Playgroud)
和一张桌子 [tblSalary]
EmpId | Salary
Run Code Online (Sandbox Code Playgroud)
我需要找到在他们部门有最高薪水的员工名单.
我可以通过以下方式实现:
SELECT *
FROM tblEmp
JOIN tblSal ON tblSal.EmpId = tblEmp.EmpId
WHERE LTRIM(STR(deptid)) + LTRIM(STR(salary)) IN (
SELECT LTRIM(STR(deptid)) + LTRIM(STR(MAX(salary)))
FROM tblSal
JOIN tblEmp ON tblSal.EmpId = tblEmp.EmpId
GROUP BY DeptId
)
Run Code Online (Sandbox Code Playgroud)
有更好的方法来实现这个清单吗?
您可以尝试使用ROW_NUMBER.
返回结果集分区中行的序号,从1开始,每个分区的第一行.
就像是
;WITH Employees AS (
SELECT e.*,
ROW_NUMBER() OVER(PARTITION BY e.DeptId ORDER BY s.salary DESC) RowID
FROM [tblEmp] e INNER JOIN
[tblSalary] s ON e.EmpId = s.EmpId
)
SELECT *
FROM Employees
WHERE RowID = 1
Run Code Online (Sandbox Code Playgroud)
但是,这不会返回在同一部门中具有相同salry的员工.
为此,您可能需要查看RANK(Transact-SQL)或DENSE_RANK(Transact-SQL)而不是ROW_NUMBER.
Rank:返回结果集分区中每行的排名.行的等级是一行加上有关行之前的等级数.
如果两个或更多行绑定排名,则每个绑定的行接收相同的排名.
Dense_Rank:返回结果集分区内的行级别,排名中没有任何间隙.行的等级是一行加上有关行之前的不同等级的数量.