Mysql求第N高的薪水

Mysql求第N高的薪水

先来个简单的:
假如有表如下:
在这里插入图片描述
我们来一个求最高的薪水,那么代码其实应该一下子就能写出来:

select salary
from Employee
ORDER BY salary desc
LIMIT 0,1

那如果是求第二高的呢?

select distinct salary
from Employee
ORDER BY salary desc
LIMIT 1,1

这里有个点需要注意一下就是,假如前两个最高的值都为100,那么,逻辑上我们并不能将第二个100看成第二高,而是应该让重复的数值只显示一次,所以我们需要加关键字distinct(DISTINCT)。然后,剩下的我们就只需要更改一下偏移量就可以了,所以,如果我们要求第N高的薪水,写成SQL的函数就是:

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 desc
      limit N,1
  );
END

注意,这里不能直接写LIMIT N-1, 1 否则会报错。因为系统推测传过来的N可能会等于0,此时N-1将等于-1,LIMIT的第一个参数偏移量无法偏移-1,所以会触发编译错误。

扩展:
针对前面的求第二高的薪水的问题,如果我们希望他取不到值的时候,返回null。那么,我们得将代码改成:

select(select distinct salary
from Employee
ORDER BY salary desc
LIMIT 1,1) as SecondHighestSalary

比较简单的做法就是在select外面再嵌套一层select查询。否则,查询不到结果不会直接返回null,而会返回一个空值“”。


版权声明:本文为weixin_44741023原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。