Запрос MySQL для получения количества сотрудников за последний доступный месяц в каждом году [дубликат]

Вопрос или проблема

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

Из этого:

год месяц количество сотрудников
2010 1 230
2013 6 1205
2022 1 200
2023 1 20
2013 5 123
2010 11 33
2023 10 45

Мне нужно это:

год месяц количество сотрудников
2010 11 33
2013 6 1205
2022 1 200
2023 10 45

Исходя из вашего описания проблемы и желаемого результата:

  • С помощью подзапроса (latest_month_per_year) получите последний месяц (MAX(month)) для каждого года, сгруппировав данные по году.
  • Затем основной запрос объединяет оригинальную таблицу с подзапросом по году и месяцу, чтобы извлечь строку с последним месяцем для каждого года.
SELECT t.year, t.month, t.employee_count
FROM employee_table t
JOIN (
    SELECT year, MAX(month) AS latest_month
    FROM employee_table
    GROUP BY year
) AS latest_month_per_year
ON t.year = latest_month_per_year.year AND t.month = latest_month_per_year.latest_month;

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

Я пробовал следующий запрос с RIGHT JOIN, который, похоже, работает:

SELECT B.year, A.month, A.employee_count
FROM 
  EMPLOYEE A 
    RIGHT JOIN
  (SELECT MAX(month) as max_month, year
   FROM 
     EMPLOYEE 
   GROUP BY year) B
ON (A.month = B.max_month AND A.year = B.year);

Ответ или решение

Для получения количества сотрудников за последний доступный месяц в каждом году из таблицы, вы можете использовать подзапрос для определения максимального месяца для каждого года, а затем выполнить соединение с основным набором данных. Вот как это можно сделать в MySQL:

SELECT t.year, t.month, t.employee_count
FROM employee_table t
JOIN (
    SELECT year, MAX(month) AS latest_month
    FROM employee_table
    GROUP BY year
) AS latest_month_per_year
ON t.year = latest_month_per_year.year AND t.month = latest_month_per_year.latest_month;

Объяснение запроса:

  1. Подзапрос (latest_month_per_year): Мы выбираем год и максимальный месяц для каждого года, используя агрегатную функцию MAX(month), и группируем по году. Этот подзапрос возвращает таблицу с уникальными годами и последним месяцем для каждого из них.

  2. Основной запрос: Мы соединяем таблицу employee_table с результатами подзапроса по году и месяцу. Это позволяет нам получить полную информацию о сотрудниках за последний месяц каждого года.

Пример данных:

Предположим, у вас следующие данные в таблице:

year | month | employee_count
------------------------------
2010 | 1     | 230
2010 | 11    | 33
2013 | 5     | 123
2013 | 6     | 1205
2022 | 1     | 200
2023 | 1     | 20
2023 | 10    | 45

В результате выполнения запроса выше вы получите:

year | month | employee_count
------------------------------
2010 | 11    | 33
2013 | 6     | 1205
2022 | 1     | 200
2023 | 10    | 45

Эти данные будут соответствовать последнему месяцу для каждого из годов в вашей таблице.

Дополнительная информация:

Если вы хотите использовать RIGHT JOIN, это также возможно, однако важно убедиться, что ваши условия объединения корректны. Напоминаю, что в большинстве случаев стандартный INNER JOIN будет более простым и эффективным методом для этой задачи.

Ваша реализация с RIGHT JOIN будет выглядеть следующим образом:

SELECT B.year, A.month, A.employee_count
FROM 
  employee_table A 
    RIGHT JOIN
  (SELECT MAX(month) AS max_month, year
   FROM employee_table 
   GROUP BY year) B
ON (A.month = B.max_month AND A.year = B.year);

Это также вернёт ожидаемые результаты, однако может быть менее интуитивно понятным в контексте вашей задачи. Используйте метод, который вам более удобен и понятен.

Оцените материал
Добавить комментарий

Капча загружается...