Когда мой запрос возвращает ноль? (Вопрос о самой высокой зарплате) - PullRequest
0 голосов
/ 14 ноября 2018

Напишите SQL-запрос, чтобы получить n-ю самую высокую зарплату из таблицы Employee.

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

Например, учитывая приведенную выше таблицу Employee, n-я самая высокая зарплата, где n = 2, равна 200. Если нет n-й самой высокой зарплаты, то запрос должен вернуть ноль.

+------------------------+
| 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

Мой вопрос: почему принятое решение может возвращать ноль, если в таблице только одно значение? Спасибо

Кстати, этот вопрос использовать MySQL enter image description here

1 Ответ

0 голосов
/ 14 ноября 2018

Сбой, потому что подзапрос всегда будет возвращать набор строк, даже если их нет "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;

Здесь - реекстер, показывающий, что он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...