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 07 MySQL
将图片保存到mysql数据库并展示在前端页面的实现代码
May 02 MySQL
如何用Navicat操作MySQL
May 12 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
MySQL分区路径子分区再分区
Apr 13 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
PHP APC配置文件2套和参数详解
2014/06/11 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
Numpy之random函数使用学习
2019/01/29 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
工业学校毕业生自荐书
2014/01/03 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
群众路线专项整治方案
2014/10/27 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
Redis基本数据类型List常用操作命令
2022/06/01 Redis