LeetCode 176:获取第二高薪资SQL查询问题求助
LeetCode 176《获取第二高薪资》问题排查与修正
原代码的核心问题
第一个版本的错误
IFNULL的第二个参数使用了字符串'null',而题目要求返回SQL的空值NULL(不带引号)。字符串'null'和SQL空值是完全不同的类型,这会直接导致结果不符合题目要求。
第二个版本的遗留问题
- 多余的
salary > 0过滤条件:题目没有限制薪资必须大于0,若测试用例包含薪资为0的场景(比如员工薪资为[100, 0]或[0, 0]),这个条件会错误过滤掉有效数据,导致无法正确获取第二高薪资。 - 子查询可能返回多行数据:当存在多个相同的第二高薪资时,
SELECT salary_ranked.salary FROM salary_ranked WHERE rank_num =2会返回多行,而IFNULL的第一个参数要求是单个值,这会引发报错或不符合预期的结果。
修正后的正确写法
写法一:保留窗口函数+确保子查询返回单个值
WITH salary_ranked AS ( SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank_num FROM Employee ) SELECT IFNULL( (SELECT DISTINCT salary FROM salary_ranked WHERE rank_num = 2), NULL ) AS SecondHighestSalary;
- 去掉了不必要的
salary >0条件,兼容所有合法薪资值。 - 子查询中加入
DISTINCT,确保即使有多个相同的第二高薪资,也只返回一个值。
写法二:更简洁的窗口函数+MAX聚合
WITH salary_ranked AS ( SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank_num FROM Employee ) SELECT MAX(salary) AS SecondHighestSalary FROM salary_ranked WHERE rank_num = 2;
- 利用
MAX()聚合函数自动处理无符合条件数据的情况(此时MAX返回NULL),无需额外使用IFNULL。 - 天然保证返回单个值,避免多行结果的问题。
内容的提问来源于stack exchange,提问作者bigsmallbelly
相关产品推荐
相关产品推荐

