编写一个SQL查询以从Employee表中获取第n个最高薪水。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如,给定上面的Employee表,其中n = 2的第n个最高薪水是200。如果没有n个最高薪水,则查询应返回null。
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+
此解决方案失败
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN(
SELECT Salary
FROM (SELECT * FROM Employee ORDER BY Salary DESC LIMIT N)
AS TEMP
ORDER BY Salary ASC LIMIT 1
);
END
接受的解决方案:
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
我的问题是,当表中只有一个值时,为什么接受的解决方案可以返回null?谢谢
答案 0 :(得分:0)
它失败了,因为子查询总是要返回一组行,即使它们中没有“ n”行。
可能最简单的方法是使用offset
/ limit
:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET v_offset = N - 1;
RETURN(SELECT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET v_offset
);
END;
Here是一个糊口,表明它可以正常工作。