Получите вторую по величине зарплату в SQL

Потеря соединения в связанных запросах.

select emp_no,salary
from salaries e 
where 2 = 
    (select count(distinct salary) from salaries p where p.salary>e.salary);

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

Я использую рабочую среду sql.

Прикрепил: Скриншот ошибки

Сообщить нам, что база данных представляет собой SQL Workbench, это все равно, что сообщить нам, на какой марке автомобиля вы ездите, основываясь на логотипе бренда, показанном на радиоприемнике на приборной панели. Для некоторых это нормально, но настораживает ваш механик.

Joel Coehoorn 24.09.2023 00:04
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
82
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не думаю, что ваш SQL даст вам желаемый результат, но это второстепенный вопрос. Чтобы устранить эту ошибку, просто увеличьте настройку таймаута: https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_net_read_timeout

А потом ждать, даже дольше 30 секунд, пока не появится ошибка? Лучшим вариантом по-прежнему будет использование правильного запроса.

Luuk 24.09.2023 16:31
Ответ принят как подходящий

Похоже, что время ожидания соединения составляет 30 секунд, а неэффективный запрос занимает слишком много времени. Этот способ намного быстрее и должен завершиться до истечения времени ожидания:

SELECT emp_no, salary
FROM
(
    select emp_no,salary,row_number() over (order by salary desc) rn
    from salaries e  
) t
WHERE rn = 2

В конце концов, если MySQL правильно реализует ключевое слово ANSI QUALIFY, это может потребовать еще меньше кода и работать даже немного быстрее.

При наличии нескольких сотрудников с одинаковой зарплатой запрос отображает только одного из них.

slaakso 24.09.2023 10:41

@slaakso Если это имеет значение, достаточно просто поменять row_number() на dense_rank()

Joel Coehoorn 25.09.2023 03:11

Это был бы лучший ответ

slaakso 25.09.2023 11:51

Это немного запутанно, но вы можете избежать такого order by:

select emp_no, salary
from salaries
where salary = (
  select max(salary)
  from salaries
  where salary != (
    select max(salary)
    from salaries
  )
)

По какой-то причине это работает лучше: select i from integers where i=(select max(i) from integers where i < (select max(i) from integers)); (изменено != на <)

Luuk 24.09.2023 16:37

Еще один вариант с использованием ключевого слова LIMIT + OFFSET:

SELECT emp_no,
       salary
FROM salaries
ORDER BY salary DESC
LIMIT 1 OFFSET 1

Если у вас может быть более двух записей со второй по величине зарплатой, ответ Джоэла более подходит, но при этом следует изменить оконную функцию на DENSE_RANK вместо ROW_NUMBER.

Другие вопросы по теме