1. 题目描述
编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。
1 | +----+--------+ |
例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null。
1 | +------------------------+ |
2. 题解
2.1. MySQL 题解(ORDER BY + LIMIT)
首先,本题要求的第N个,是去重排序第N个,题目没有描述清楚。面试也一样,让你求TOP N,先问清楚要不要去重
ORDER BY + LIMIT 可以解决TOPN问题
1 | -- 正确做法 |
GROUP BY可以替换DISTINCT1
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 | CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT |
如果想引用函数参数,必须先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