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 10 MySQL
MySQL 视图(View)原理解析
May 19 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
MySQL注入基础练习
May 30 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL系列之十三 MySQL的复制
Jul 02 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
用mysql内存表来代替php session的类
2009/02/01 PHP
PHP 简单日历实现代码
2009/10/28 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
JS与框架页的操作代码
2010/01/17 Javascript
Jquery 扩展方法
2010/05/06 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
2013/02/04 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
jQuery简介_动力节点Java学院整理
2017/07/04 jQuery
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
在Python中使用Neo4j数据库的教程
2015/04/16 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
Python如何实现邮件功能
2020/05/27 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
学校安全检查制度
2014/01/27 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
2014年后备干部工作总结
2014/12/08 职场文书
三方协议书
2015/01/27 职场文书
学生会干部任命书
2015/09/21 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python