You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:45:19