SQL-запрос, чтобы узнать имя и зарплату сотрудника, который получал самую высокую зарплату за каждый месяц

#mysql #sql

Вопрос:

SQL Здесь вы можете видеть, что я пишу ниже код, который выдает идентификатор и зарплату, но мне нужны имя и зарплата

 CREATE TABLE salary_data (
      id INTEGER NOT NULL,
      month INTEGER NOT NULL,
      salary INTEGER NOT NULL
    );
    -- another TABLE
    CREATE TABLE emp_data (
        id INTEGER NOT NULL,
        name TEXT NOT NULL);
    -- insert some values
    INSERT INTO salary_data VALUES (1, 3,50000);
    INSERT INTO salary_data VALUES (2,4,45000);
    INSERT INTO salary_data VALUES (3,3,36000);
    INSERT INTO salary_data VALUES (4,5,72000);
    INSERT INTO salary_data VALUES (1,6,49000);
    INSERT INTO salary_data VALUES (4,4,51000);
    INSERT INTO salary_data VALUES (2,5,64000);
    INSERT INTO emp_data VALUES (1, "RAMESH");
    INSERT INTO emp_data VALUES (2, "SURESH");
    INSERT INTO emp_data VALUES (3, "NIKHIL");
    INSERT INTO emp_data VALUES (4, "RAJEEV");
    -- fetch some values
    SELECT id,max(salary) FROM salary_data GROUP BY month;
 

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

Мне нужен такой тип вывода

имя зарплата,

рамеш 50000

как это

Комментарии:

1. Вы сделали первый шаг и пропустили второй. Вы нашли самую высокую зарплату в месяц. Теперь найдите сотрудников, которые зарабатывают так много. К сожалению, однако, ваша база данных не содержит информации о том, какой сотрудник что заработал. В вашей таблице salary_data отсутствует идентификатор сотрудника, чтобы связать зарплату с сотрудником. Или, подождите, идентификатор данных о зарплате должен быть идентификатором сотрудника?

2. Ваш запрос неверен. Вы группируетесь по месяцам, поэтому вы не можете выбрать идентификатор, потому что в месяц существует несколько идентификаторов. Вы находитесь в пресловутом режиме обмана MySQL, который допускает такие недопустимые запросы. Убедитесь, что вы вышли из этого режима, подав заявку SET sql_mode = 'ONLY_FULL_GROUP_BY'; .

Ответ №1:

Вы сделали первый шаг и пропустили второй. Вы нашли самую высокую зарплату в месяц. Теперь найдите сотрудников, которые зарабатывают так много.

Вот один из способов сделать это:

 select *
from salary_data s
join emp_data e on e.id = s.id -- s.id is a misnomer for s.emp_id
where (s.month, s.salary) in
(
  select month, max(salary)
  from salary_data
  group by month
);
 

Вот еще один (возможен только с MySQL 8):

 select *
from
(
  select
    id as emp_id, month, salary, 
    max(salary) over (partition by month) as max_salary_for_the_month
  from salary_data
) s
join emp_data e on e.id = s.emp_id
where s.salary = s.max_salary_for_the_month
order by s.month;