SQL查询employee表:第二高薪资缺失时返回最高薪资的实现问题
现有代码问题说明
- 你代码里的
coalesce(2,1)没有实际作用:coalesce返回第一个非空参数,2是固定非空值,所以这部分永远返回2,自然永远不会取到rnk=1的结果,没法处理只有一行薪资的场景。 - 直接按rnk筛选会返回多行:如果存在多名员工薪资相同的情况,
rank()会给相同薪资的员工分配相同的排名,筛选时就会返回多条符合条件的记录。
解决方案1:窗口函数版本
适合需要同时兼容更多排名查询的场景,用薪资档位计数判断是否存在第二高薪资,加LIMIT保证仅返回1行:
SELECT salary AS "SecondHighestSalary" FROM ( SELECT salary, DENSE_RANK() OVER(ORDER BY salary DESC) AS rnk, COUNT(DISTINCT salary) OVER() AS sal_level_count FROM employee2 ) t WHERE rnk = CASE WHEN sal_level_count >= 2 THEN 2 ELSE 1 END LIMIT 1;
解决方案2:子查询+COALESCE版本
写法更简洁,直接针对需求实现,天生仅返回单行结果:
SELECT COALESCE( -- 取第二高的去重薪资,不存在时返回NULL (SELECT DISTINCT salary FROM employee2 ORDER BY salary DESC LIMIT 1 OFFSET 1), -- 上一步为NULL时,返回最高薪资 (SELECT DISTINCT salary FROM employee2 ORDER BY salary DESC LIMIT 1) ) AS "SecondHighestSalary";
内容的提问来源于stack exchange,提问作者Lara
相关产品推荐
相关产品推荐

