177、第N高的薪水--leetcode

这是一篇关于如何在SQL中找到表中第N高的薪水的博客。介绍了两种方法,包括使用子查询和子句,以及使用IFNULL函数。文章强调了处理可能存在的重复值和空值的问题,并提供了SQL查询的注意事项,如使用LIMIT和ORDER BY语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

编写一个SQL查询,获取Employee表中的第n高的薪水(Salary)。

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

例如上述的Employee表中,n=2时,应该返回第二高的薪水200
如果不存在第n高的薪水,那么就返回null

+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

算法设计与分析:
方法一:使用子查询和LIMIT子句

  • 算法:传入的参数是N,将不同的薪资按照降序进行排序,然后使用LIMIT子句获得第n高的薪资,注意limit n,m的用法:limit 2,3:返回的是3,4,5位置的数据,即范围是(n+1,n+m)。
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  set n = N-1;
  RETURN (
  # Write your MySQL query statement below.
        select distinct 
            Salary
        from 
            Employee
        order by 
            Salary
        # 返回的是第N条数据,前面已经设置n=N-1,所以这里直接返回第n+1条这一条数据。
        desc limit n, 1
  );
END

方法二:使用IFNULLLIMIT子句
解决“NULL”问题的另外一种方法是使用“IFNULL”函数,其值差不多:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  declare P int default N-1;
  if (P<0) then
    return null;
  else
    return (
    # Write your MySQL query statement below.
      select IFNULL((
        select distinct 
            Salary
        from 
            Employee
        order by 
            Salary
        desc limit P, 1
      ),null) as getNthHighestSalary
    );
  end if;
END

一些技巧性的东西要积累:

  • 和176道题目差不多,这里使用活值!
  • distinct :去除重复的值,因为返回的值可能会包含重复的值,本题如果不加,就通不过他那个设置重复值的测试用例。
  • IFNULL(xxx,null) :返回空值处理
  • AS xxx :取别名
  • limit n,m:获取n+1到之后的m条数据
  • order by xxx desc: 按照字段xxx降序排序

注: 本题解参考到leetcode官方题解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值