Получите 2-ую самую высокую зарплату, если какой-либо сотрудник может получить такую ​​же зарплату - PullRequest
0 голосов
/ 29 апреля 2018
employee Table;

+--------+------------------+
| emp_id | emp_name  salary |
+--------+----------+--------+
| 1      | James    |  2000  |
| 2      | Jack     |   4000 |
| 3      | Henry    |   6000 |
| 5      | John     |   8000 |
| 6      | Martin   |   6000 |`
| 7      | Deny     |   6000 |

Я хочу получить вторую по величине зарплату, и согласно таблице вторая по величине зарплата будет: -

+--------+------------------+
| emp_id | emp_name  salary |
+--------+----------+--------+
| 3      | Henry    |   6000 |
| 6      | Martin   |   6000 |`
| 7      | Deny     |   6000 |

Как мне этого добиться?

Я не могу использовать: -

select * from employee order by salary desc Limit 1,1

потому что он всегда показывает только одну запись.

Любая помощь будет оценена.

Спасибо !!!

Ответы [ 6 ]

0 голосов
/ 29 апреля 2018

Я бы хотел подойти к этому с помощью подзапроса:

select e.*
from employee e
where e.salary = (select distinct e2.salary
                  from employee e2
                  order by e2.salary desc
                  limit 1 offset 1
                 );

Подзапрос также можно переместить в предложение from, поскольку оно не коррелировано. Это просто упорядочение всех отдельных зарплат и использование limit / offset для получения второй. Без использования оконных функций (т. Е. dense_rank()) это кажется самым ясным решением.

0 голосов
/ 29 апреля 2018

Спасибо всем за ответ.

Я пробовал следующий запрос, и он работает для меня.

select * from employee where salary=(select salary from employee order by salary desc limit 1,1)
0 голосов
/ 29 апреля 2018

Если вы используете MySQL 8.0 или более новую версию, вы можете попробовать DENSE_RANK() оконную функцию, см. Документацию здесь .

SELECT * FROM
(
    SELECT
        e.*,
        DENSE_RANK() OVER w AS 'rank'
    FROM
        employee e
    WINDOW w AS (ORDER BY e.salary DESC)
) a

WHERE a.rank = 2;
0 голосов
/ 29 апреля 2018

SQL-запрос должен быть общим для N-й самой высокой зарплаты. Например: из приведенной ниже таблицы нам нужно определить 3-ю / N-ю самую высокую зарплату. В этом примере b, d должны быть напечатаны.

Empname    Salary
A           400
B           200
C           100
D           200
E           300

Используйте запрос следующим образом: здесь N должно быть 3 для 3-й самой высокой зарплаты и т. Д.

SELECT *
FROM Employee Emp1
WHERE (N-1) = ( 
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2 WHERE Emp2.Salary > Emp1.Salary)

Надеюсь, этот общий запрос поможет.

0 голосов
/ 29 апреля 2018

Вы можете выбрать непосредственное нижнее значение, чем максимальное, во встроенном подзапросе (запрос в скобках), а затем выполнить запрос на выборку на основе результатов, которые он отбрасывает назад:

select `emp_id`, `emp_name`, `salary` from employee where `salary` = (select `salary` from employee where `salary` < MAX(salary) order by salary desc limit 1);
0 голосов
/ 29 апреля 2018

Этот запрос можно использовать:

select * from employee where salary =
(select max(salary) from employee where salary <
(select max(salary) from employee));

Для набора данных это результат:

+--------+----------+--------+
| emp_id | emp_name | salary |
+--------+----------+--------+
|      3 | Henry    |   6000 |
|      6 | Martin   |   6000 |
|      7 | Deny     |   6000 |
+--------+----------+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...