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,而会返回一个空值“”。