Leetcode No.176 第二高的薪水(对Row_number()函数进行简要介绍)

难度:简单

编写一个 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值