Получение второго по величине значения зарплаты в MySQL - PullRequest
0 голосов
/ 21 ноября 2018

В заданном вопросе

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

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

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

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

Я написал код для этого вопроса, однако ожидаемый результат будетразные.

Мой код:

SELECT
CASE
    WHEN COUNT(*) = 1 THEN NULL
    ELSE (SELECT Salary FROM Employee HAVING Salary < MAX(Salary) ORDER BY Salary DESC LIMIT 1)
END AS SecondHighestSalary
FROM Employee;

Я думаю, что с моим кодом что-то не так, но я не могу найти, в чем здесь проблема.Мой код возвращает 100, а не 200.Что я ошибся?

+---------------------+
| SecondHighestSalary |
+---------------------+
| 100                 |
+---------------------+

Ответы [ 5 ]

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

Вот решение.

SELECT MAX(salary) From Employee WHERE salary < ( SELECT Max(salary) FROM Employee);
0 голосов
/ 21 ноября 2018

Если вы хотите отобразить empty_row (null) в случае, если нет максимальной зарплаты, тогда следующее делает это, если есть значение, тогда оно отображается

select (select salary
          from Employee ORDER BY salary DESC LIMIT 1,1
        ) as x
0 голосов
/ 21 ноября 2018

Вы можете попробовать ниже

SELECT MAX(salary) From Employee WHERE salary < ( SELECT Max(salary) FROM Employee);
0 голосов
/ 21 ноября 2018

Попробуйте это:

SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1,1

или для более глубокого подхода вы можете использовать что-то вроде:

SELECT salary FROM Employee GROUP BY salary ORDER BY salary DESC LIMIT 1,1

Все эти запросы имеют высокую производительность, поскольку у них нет подзапросов.

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

Вы можете использовать LIMIT {[offset,] row_count}.См. https://dev.mysql.com/doc/refman/8.0/en/select.html

Упорядочить по Salary в порядке убывания и получить вторую строку, определив OFFSET как 1. Мы будем использовать DISTINCT для Salary, поскольку существует возможность иметь несколькоряды для самой высокой зарплаты.

SELECT DISTINCT
  Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1,1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...