LeetCode Database 177 第N个最高工资

1. 题目描述

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

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

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

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

2. 题解

2.1. MySQL 题解(ORDER BY + LIMIT)

首先,本题要求的第N个,是去重排序第N个,题目没有描述清楚。面试也一样,让你求TOP N,先问清楚要不要去重

ORDER BY + LIMIT 可以解决TOPN问题

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

GROUP BY可以替换DISTINCT

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 Salary FROM Employee
GROUP BY Salary
ORDER BY Salary DESC
LIMIT N, 1
);
END

要注意的是,在MySQL语法上要求RETURN 返回SELECT语句时,要加上(),而且内部,不能直接引用函数参数

1
2
3
4
5
6
7
8
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
SELECT DISTINCT Salary FROM Employee
ORDER BY Salary DESC
LIMIT N - 1, 1 -- 语法错误,不能直接引用N
);
END

如果想引用函数参数,必须先SET,或者再声明其它变量,引用函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 方式1
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1; -- 先SET
RETURN (
SELECT DISTINCT Salary FROM Employee
ORDER BY Salary DESC
LIMIT N, 1
);
END

-- 方式2
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE m INT;
SET m = N - 1;
RETURN (
SELECT DISTINCT Salary FROM Employee
ORDER BY Salary DESC
LIMIT m, 1
);
END

panchaoxin wechat
关注我的公众号
支持一下