编写SQL查询,从Employee表中获得第9位最高薪资。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+例如,在上面的雇员表中,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?谢谢
顺便说一下,这个问题使用MySQL

发布于 2018-11-14 19:27:48
它失败,因为子查询总是返回一组行,即使没有"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;这里是一个rextester,显示了它的工作原理。
https://stackoverflow.com/questions/53306266
复制相似问题