SQL实现LeetCode(176.第二高薪水)


Posted in MySQL onAugust 04, 2021

[LeetCode] 176.Second Highest Salary 第二高薪水

Write a SQL query to get the second highest salary from the Employee table.

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

For example, given the above Employee table, the second highest salary is 200. If there is no second highest salary, then the query should return null.

这道题让我们找表中某列第二大的数,这道题有很多种解法,先来看一种使用Limit和Offset两个关键字的解法,MySQL中Limit后面的数字限制了我们返回数据的个数,Offset是偏移量,那么如果我们想找第二高薪水,我们首先可以先对薪水进行降序排列,然后我们将Offset设为1,那么就是从第二个开始,也就是第二高薪水,然后我们将Limit设为1,就是只取出第二高薪水,如果将Limit设为2,那么就将第二高和第三高薪水都取出来:

解法一:

SELECT Salary FROM Employee GROUP BY Salary
UNION ALL (SELECT NULL AS Salary)
ORDER BY Salary DESC LIMIT 1 OFFSET 1;

我们也可以使用Max函数来做,这个返回最大值,逻辑是我们取出的不包含最大值的数字中的最大值,即为第二大值:

解法二:

SELECT MAX(Salary) FROM Employee 
WHERE Salary NOT IN
(SELECT MAX(Salary) FROM Employee);

下面这种方法和上面基本一样,就是用小于号<代替了Not in关键字,效果相同:

解法三:

SELECT MAX(Salary) FROM Employee
Where Salary <
(SELECT MAX(Salary) FROM Employee);

最后来看一种可以扩展到找到第N高的薪水的方法,只要将下面语句中的1改为N-1即可,第二高的薪水带入N-1就是1,下面语句的逻辑是,假如我们要找第二高的薪水,那么我们允许其中一个最大值存在,然后在其余的数字中找出最大的,即为整个的第二大的值;

解法四:

SELECT MAX(Salary) FROM Employee E1
WHERE 1 =
(SELECT COUNT(DISTINCT(E2.Salary)) FROM Employee E2
WHERE E2.Salary > E1.Salary);

参考资料:

https://leetcode.com/discuss/47041/very-very-simple-solution

https://leetcode.com/discuss/42849/general-solution-not-using-max

https://leetcode.com/discuss/21751/simple-query-which-handles-the-null-situation

到此这篇关于SQL实现LeetCode(176.第二高薪水)的文章就介绍到这了,更多相关SQL实现第二高薪水内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
多属性、多分类MySQL模式设计
Apr 05 MySQL
mysql的MVCC多版本并发控制的实现
Apr 14 MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 MySQL
浅谈MySQL表空间回收的正确姿势
Oct 05 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
mysql函数全面总结
Nov 11 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
MySQL数据库表约束讲解
Jun 21 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 MySQL
SQL Server数据库的三种创建方法汇总
May 08 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 #MySQL
SQL之各种join小结详细讲解
SQL实现LeetCode(175.联合两表)
Aug 04 #MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 #MySQL
sql注入教程之类型以及提交注入
MySQL子查询中order by不生效问题的解决方法
Aug 02 #MySQL
MySQL中utf8mb4排序规则示例
Aug 02 #MySQL
You might like
Syphon 秘笈
2021/03/03 冲泡冲煮
php中随机显示图片的函数代码
2011/06/23 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
javascript 节点排序 2
2011/01/31 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
python之Socket网络编程详解
2016/09/29 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
Python列表解析配合if else的方法
2018/06/23 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
python支持多继承吗
2020/06/19 Python
如何使用python写截屏小工具
2020/09/29 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
公务员的自我鉴定
2013/10/26 职场文书
新闻编辑自荐信
2013/11/03 职场文书
2015年端午节活动方案
2015/05/05 职场文书
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫