难度:简单
编写一个 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
然而,如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,有以下两种方式
方法一:将上述查询出来的结果作为临时表。
SELECT
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1) AS SecondHighestSalary
方法二:使用 “IFNULL” 函数。
SELECT IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
作者:LeetCode
链接:https://leetcode-cn.com/problems/second-highest-salary/solution/di-er-gao-de-xin-shui-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。