题目描述

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

1
2
3
4
5
6
7
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+

例如上述Employee表,当N=2时,SQL查询应该返回200作为第二高的薪水,如果不存在第N高的薪水,那么查询应该返回null.

1
2
3
4
5
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+

解法

和176题的思路相同。先对Salary去重,防止相等的数据对后面查询造成干扰,根据Salary进行降序排序,然后使用limit关键字略过第N-1条信息,得到接下来的第一条信息则得到的即为第N高的薪水。

1
2
3
4
5
SELECT IFNULL(
(SELECT DISTINCT Salary
FROM Employee ORDER BY Salary DESC
LIMIT 1, 1), NULL)
AS SecondHighestSalary ;

使用函数的方法来封装查询语句

1
2
3
4
5
6
7
8
9
10
11
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT IFNULL(
(SELECT DISTINCT Salary
FROM Employee ORDER BY Salary DESC
LIMIT N, 1), NULL
)
);
END

注意:这里不能在limit关键字后面写N-1,需要先将变量计算好,set N = N - 1,再在sql语句中使用N

参考