我的查询何时返回null? (N个最高薪水问题)

时间:2018-11-14 18:01:36

标签: mysql sql

编写一个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

以上解决方案均未通过 enter image description here

enter image description here

接受的解决方案:

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 enter image description here

1 个答案:

答案 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是一个糊口,表明它可以正常工作。