MySQL使用dense_rank查询第二高薪水 解决LeetCode提交不通过问题
你提交的SQL无法通过测试主要存在两个问题:
- 当不存在第二高薪资(如表内仅1条员工记录、所有员工薪资相同)时,
where salary_order=2没有匹配行,最终返回空集,不符合题目要求该场景返回null的规则。你使用的coalesce(salary, null)在此场景下完全不生效,因为coalesce仅能处理返回行中字段为null的情况,无法处理无返回行的场景。 - 当多名员工薪资并列第二时,查询会返回多条重复记录,不符合题目要求返回单一值的规则。
使用dense_rank完全可以实现需求,修正后的写法参考:
WITH temp1 AS ( SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_order FROM employee ) SELECT MAX(salary) AS SecondHighestSalary FROM temp1 WHERE salary_order = 2;
上述写法中MAX聚合函数同时解决了两个问题:无匹配行时MAX会自动返回null,存在多并列第二的薪资时MAX也只会返回唯一的薪资值,完全匹配题目要求。
如果不想使用聚合函数,也可以用嵌套子查询的方式实现:
SELECT ( SELECT DISTINCT salary FROM ( SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_order FROM employee ) temp1 WHERE salary_order = 2 ) AS SecondHighestSalary;
内层子查询无匹配结果时,外层SELECT会自动返回null,搭配DISTINCT也能避免并列第二返回重复值。
内容的提问来源于stack exchange,提问作者Ashima
相关产品推荐
相关产品推荐

