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 相关文章推荐
教你用eclipse连接mysql数据库
Apr 22 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 MySQL
MySQL数据库表约束讲解
Jun 21 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 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
用PHP实现多服务器共享SESSION数据的方法
2007/03/16 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript使用cookie
2007/02/02 Javascript
jQuery $.each的用法说明
2010/03/22 Javascript
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
Python实现异步IO的示例
2020/11/05 Python
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
护士实习鉴定范文
2013/12/22 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技