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中in和exists区别详解
Jun 03 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
Mar 03 MySQL
MySQL优化及索引解析
Mar 17 MySQL
MySQL创建表操作命令分享
Mar 25 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL事务的隔离级别详情
Jul 15 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
smarty section简介与用法分析
2008/10/03 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
详解PHP中的PDO类
2015/07/06 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
制作特殊字的脚本
2006/06/26 Javascript
javascript 必知必会之closure
2009/09/21 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python编程中time模块的一些关键用法解析
2016/01/19 Python
python 连接各类主流数据库的实例代码
2018/01/30 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
高中体育教学反思
2014/01/29 职场文书
班主任新年寄语
2014/04/04 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
幼师中班个人总结
2015/02/12 职场文书
作息时间调整通知
2015/04/22 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB