mysql запрос печатает данные разных строк в одной строке - PullRequest
0 голосов
/ 18 февраля 2020

Я использую MySQL версию 8.0 и po pSQL в качестве редактора.

Таблица:

create table account (no int, salary int);


insert into account values
(901,25000),
(902,30000),
(903,21000),
(904,40000),
(905,27000);

Теперь я не хочу получать зарплату человеку с самой высокой зарплатой. Самая высокая зарплата - 40000, а соответствующее нет - 904. Но этот запрос дает мне другой вывод.

-- no and salary of max salary
select no, max(salary)
from account ;

Вывод: нет максимальной (зарплата) 901 40000

Это печать Сначала нет и максимальная зарплата. т.е. данные разных строк показываются в одной строке. Как это исправить ???

Тот же тип проблемы для моего следующего запроса.

-- no and salary of second highest salary.
select no, max(salary)
from account
where salary not in
(select max(salary) from account);

Вывод: нет макс (зарплата) 901 30000

В то время как ожидается = 902 30000.

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

Заранее благодарю.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Я хочу нет и зарплату человека с самой высокой зарплатой

Вам не нужно агрегирование для этого. Вы можете просто заказать и ограничить:

select no, salary
from account
order by salary desc
limit 1
1 голос
/ 18 февраля 2020

MySQL версия 5.7.5 и старше печально известна принятием некорректных SQL запросов.

В стандартных SQL при отсутствии предложения GROUP BY все столбцы должны быть агрегированным или нет. Вы, однако, решили объединить одно, а не другое. Это недопустимо в SQL и может привести к недетерминированным c результатам. Но ... MySQL принимает его.

Используйте его на свой страх и риск.

Примечание : это плохое поведение может быть включено в будущих версиях MySQL по причинам совместимости. Я бы посоветовал вам не делать таких вещей.

0 голосов
/ 19 февраля 2020

для самой высокой зарплаты

select no, salary from (
    select no, salary, ROW_NUMBER() OVER (partition by salary order by salary desc) as rn
    from account
) as a
where rn = 1 limit 1

для второй самой высокой зарплаты

select no, salary from (
    select no, salary, ROW_NUMBER() OVER (partition by salary order by salary desc) as rn
    from account
) as a
where rn = 2 limit 1
...