编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+例如上述 Employee表,SQL查询应该返回 200 作为第二高的薪水。 如果不存在第二高的薪水,那么查询应返回 null。
+---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+看到这个题,有“排序”的意思,要查第几第几,这让我立即想到了Mysql8.0所支持的Row_number()分组排序函数。
用法1: 无分组排序 Row_number() over (order by 字段 desc) 用法2:分组排序 Row_number() over (partition by 字段1 order by 字段 desc) 根据字段1分组,在分组内根据字段2排序,这个函数计算的值就表示每组内部排序后的顺序编号刚开始写的很顺利,但是当处理“不存在”的情况时,我没有处理好null,耽误了一些时间。后来想到了case…when…条件函数,去做一个区分判断就好啦! 下面是我的解答:
select case when sum(t1.rank)>=2 then salary else null end as SecondHighestSalary from (select distinct salary,Row_number() over(order by salary desc) as 'rank' from Employee group by salary) t1 where t1.rank=2用到了嵌套查询,先做一个有等级标号的表t1,然后用where进行条件判断,但若根本不存在第二的等级,查询为null值。可能我的解答不是最简单的,但也是我顺着自己的思路一点点带过的
思路:将不同的薪资按降序排序,然后使用 LIMIT 子句获得第二高的薪资。
SELECT DISTINCT Salary AS SecondHighestSalary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1然而,如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,有以下两种方式
作者:LeetCode 链接:https://leetcode-cn.com/problems/second-highest-salary/solution/di-er-gao-de-xin-shui-by-leetcode/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。