Leetcode部门最高薪资问题:rank() over函数报错排查求助
解决LeetCode部门最高薪资问题的rank()函数报错排查
嘿,我瞅见你在解决部门最高薪资问题时,用rank()函数写的SQL一直报错,咱们来揪出问题根源,再给你修正方案~
核心错误原因
你写的SQL里,在子查询的WHERE子句中直接用了窗口函数生成的别名srank,但SQL的执行顺序是先执行WHERE过滤,再计算窗口函数。这就导致当数据库处理WHERE srank = 1的时候,srank这个字段还没被计算出来,自然就会报错说找不到这个列啦。
修正方案1:嵌套子查询过滤
把原来的子查询再套一层,在外层筛选排名为1的记录:
SELECT d.Name AS 'Department', e.Name AS 'Employee', e.Salary FROM ( SELECT Name, DepartmentId, Salary, RANK() OVER (PARTITION BY DepartmentId ORDER BY Salary DESC) AS srank FROM Employee ) e JOIN Department d ON d.Id = e.DepartmentId WHERE e.srank = 1;
修正方案2:使用CTE(公共表表达式)
用CTE先定义好带排名的员工数据,再关联部门表并筛选,可读性更好:
WITH RankedEmployees AS ( SELECT Name, DepartmentId, Salary, RANK() OVER (PARTITION BY DepartmentId ORDER BY Salary DESC) AS srank FROM Employee ) SELECT d.Name AS 'Department', r.Name AS 'Employee', r.Salary FROM RankedEmployees r JOIN Department d ON d.Id = r.DepartmentId WHERE r.srank = 1;
补充说明
这里用RANK()是正确的,因为如果同一个部门里有多个员工薪资都是最高的,RANK()会给他们相同的排名(比如都是1),正好符合题目要求返回所有部门最高薪资员工的需求。如果用ROW_NUMBER()的话,只会返回其中一个,就不符合题意啦。
内容的提问来源于stack exchange,提问作者CathyQian
相关产品推荐
相关产品推荐

