编写一个 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?谢谢
最佳答案
它会失败,因为子查询总是会返回一组行,即使没有“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是一个 reextester,表明它可以工作。
关于mysql - 我的查询何时返回 null? (N最高薪资问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53306266/