Вопрос или проблема
У меня есть таблица с колонками год, месяц, количество сотрудников. Я хочу получить количество сотрудников за последний доступный месяц в каждом году.
Из этого:
год | месяц | количество сотрудников |
---|---|---|
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;
Объяснение запроса:
-
Подзапрос (
latest_month_per_year
): Мы выбираем год и максимальный месяц для каждого года, используя агрегатную функциюMAX(month)
, и группируем по году. Этот подзапрос возвращает таблицу с уникальными годами и последним месяцем для каждого из них. -
Основной запрос: Мы соединяем таблицу
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);
Это также вернёт ожидаемые результаты, однако может быть менее интуитивно понятным в контексте вашей задачи. Используйте метод, который вам более удобен и понятен.