Leetcode No.177. Nth Highest Salary

177. Nth Highest Salary

原题目链接:177. Nth Highest Salary

写一条SQL查询语句从Employee表中找出第 $N^{th}$高的薪资。

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

比如,在上面的Employee表当中,当$n = 2$时第 $N^{th}$高的薪资查询语句应该返回200。如果没有第 $N^{th}$的薪资,则查询语句应该返回null

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

Solution

方法一:采用自定义函数和LIMIT语句[Accepted]

Algorithm

自定义函数getNthHighestSalary(),传入一个整型参数N,然后利用LIMIT语句配合OFFSET语句获得第 $N^{th}$高的薪资,注意如果没有的话,同样需要借助IFNULL()函数来判断是否为空。

MySQL

1
2
3
4
5
6
7
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE x int;
SET M = N - 1;
SET x = (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M, 1);
return IFNULL(x,NULL);
END

需要注意的是,求第 $N^{th}$高的薪资实际上只需要LIMIT$n-1$个就可以了,另外也可以使用IF-ELSE结构代替IFNULL()函数。

1
2
3
4
5
6
7
8
9
10
11
12
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE x int;
SET M = N - 1;
SET x = (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M, 1);
IF ISNULL(x)
THEN
RETURN NULL;
ELSE
RETURN x;
END IF;
END