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

LeetCode 176:获取第二高薪资SQL查询问题求助

LeetCode 176《获取第二高薪资》问题排查与修正

原代码的核心问题

第一个版本的错误

  • IFNULL的第二个参数使用了字符串'null',而题目要求返回SQL的空值NULL(不带引号)。字符串'null'和SQL空值是完全不同的类型,这会直接导致结果不符合题目要求。

第二个版本的遗留问题

  1. 多余的salary > 0过滤条件:题目没有限制薪资必须大于0,若测试用例包含薪资为0的场景(比如员工薪资为[100, 0]或[0, 0]),这个条件会错误过滤掉有效数据,导致无法正确获取第二高薪资。
  2. 子查询可能返回多行数据:当存在多个相同的第二高薪资时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:25:20