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新手入门的基本操作汇总
May 13 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
MySql子查询IN的执行和优化的实现
Aug 02 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
Mysql使用全文索引(FullText index)的实例代码
Apr 03 MySQL
MySQL创建管理子分区
Apr 13 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
MySQL添加索引特点及优化问题
Jul 23 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 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
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python三元运算实现方法
2015/01/12 Python
Python简单日志处理类分享
2015/02/14 Python
理解python正则表达式
2016/01/15 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python正则表达式re之compile函数解析
2017/10/25 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
TensorFlow实现Logistic回归
2018/09/07 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
2019/08/23 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
应征英语教师求职信
2013/11/27 职场文书
个人查摆剖析材料
2014/02/04 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
银行委托书范本
2014/04/04 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
结婚主持人致辞
2015/07/28 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js