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 角色(role)功能介绍
Apr 24 MySQL
MySQL索引知识的一些小妙招总结
May 10 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
MySQL单表千万级数据处理的思路分享
Jun 05 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
SQL语句多表联合查询的方法示例
Apr 18 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
Mysql中常用的join连接方式
May 11 MySQL
MySQL深分页问题解决思路
Dec 24 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实现的四则运算表达式计算实现代码
2011/08/02 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
javascript引用对象的方法
2007/01/11 Javascript
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
python SVM 线性分类模型的实现
2019/07/19 Python
Python 列表的清空方式
2020/01/13 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
车辆工程专业求职信
2014/06/14 职场文书
学校四风对照检查材料
2014/08/28 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
表扬通报怎么写
2015/01/16 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python