SQL实现LeetCode(177.第N高薪水)

 更新时间:2021年08月03日 15:10:01   作者:Grandyang  
这篇文章主要介绍了SQL实现LeetCode(177.第N高薪水),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 177.Nth Highest Salary 第N高薪水

Write a SQL query to get the nth highest salary from the Employee table.

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

For example, given the above Employee table, the nth highest salary where n = 2 is 200. If there is no nth highest salary, then the query should return null.

这道题是之前那道Second Highest Salary的拓展,根据之前那道题的做法,我们可以很容易的将其推展为N,根据对Second Highest Salary中解法一的分析,我们只需要将OFFSET后面的1改为N-1就行了,但是这样MySQL会报错,估计不支持运算,那么我们可以在前面加一个SET N = N - 1,将N先变成N-1再做也是一样的:

解法一:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  SET N = N - 1;
  RETURN (
      SELECT DISTINCT Salary FROM Employee GROUP BY Salary
      ORDER BY Salary DESC LIMIT 1 OFFSET N
  );
END

根据对Second Highest Salary中解法四的分析,我们只需要将其1改为N-1即可,这里却支持N-1的计算,参见代码如下:

解法二:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      SELECT MAX(Salary) FROM Employee E1
      WHERE N - 1 =
      (SELECT COUNT(DISTINCT(E2.Salary)) FROM Employee E2
      WHERE E2.Salary > E1.Salary)
  );
END

当然我们也可以通过将最后的>改为>=,这样我们就可以将N-1换成N了:

解法三:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      SELECT MAX(Salary) FROM Employee E1
      WHERE N =
      (SELECT COUNT(DISTINCT(E2.Salary)) FROM Employee E2
      WHERE E2.Salary >= E1.Salary)
  );
END

类似题目:

Second Highest Salary

参考资料:

https://leetcode.com/discuss/88875/simple-answer-with-limit-and-offset

https://leetcode.com/discuss/63183/fastest-solution-without-using-order-declaring-variables

到此这篇关于SQL实现LeetCode(177.第N高薪水)的文章就介绍到这了,更多相关SQL实现第N高薪水内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySql实现跨表查询的方法详解

    MySql实现跨表查询的方法详解

    本篇文章是对MySql实现跨表查询的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MYSQL必知必会读书笔记第七章之数据过滤

    MYSQL必知必会读书笔记第七章之数据过滤

    这篇文章主要介绍了MYSQL必知必会读书笔记第七章之数据过滤的相关资料,需要的朋友可以参考下
    2016-05-05
  • MySQL内存使用之线程独享介绍

    MySQL内存使用之线程独享介绍

    这篇文章主要介绍了MySQL内存使用之线程独享介绍,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量,需要的朋友可以参考下
    2014-12-12
  • MySQL如何使用union all获得并集排序

    MySQL如何使用union all获得并集排序

    这篇文章主要介绍了MySQL如何使用union all获得并集排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • mysql 字符串转数组的实现示例

    mysql 字符串转数组的实现示例

    有时候,我们需要将一个字符串拆分成一个数组,本文主要介绍了mysql 字符串转数组的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • SQL UNION运算符及其应用场景深入探究

    SQL UNION运算符及其应用场景深入探究

    这篇文章主要为大家介绍了SQL UNION运算符及其应用场景示例深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • MySQL数据备份方法的选择与思考

    MySQL数据备份方法的选择与思考

    这篇文章主要介绍了MySQL数据备份方法该如何选择,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03
  • mysql获得60天前unix时间思路及代码

    mysql获得60天前unix时间思路及代码

    首先根据now()获得当前时间,使用adddate()方法获得60天前时间,使用unix_timestamp()方法转换时间类型
    2014-08-08
  • MySQL8.0.23免安装版配置详细教程

    MySQL8.0.23免安装版配置详细教程

    这篇文章主要介绍了MySQL8.0.23免安装版配置教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • CentOS 7 安装Percona Server+Mysql

    CentOS 7 安装Percona Server+Mysql

    这篇文章主要介绍了CentOS 7 安装Percona Server+Mysql的相关资料,需要的朋友可以参考下
    2018-11-11

最新评论