Как получить все строки только с максимальным годом в каждой категории таблицы в MYSQL (версия 5.7)

#mysql

Вопрос:

У меня есть таблица из нескольких строк с категориями и годами:

ID Категория год
1 cat1 2022
2 cat1 2022
3 cat1 2021
4 cat2 2019
5 cat2 2019
6 cat2 2018
7 cat2 2018

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

ID Категория год
1 cat1 2022
2 cat1 2022
4 cat2 2019
5 cat2 2019

Я пробовал использовать GROUP BY, но получаю только одну строку для каждого года и категории:

 SELECT 
 ANY_VALUE(`id`) AS `id`, 
 ANY_VALUE(`category`) AS `category`,
 MAX(`year`) AS `year` 
FROM `my_table` 
GROUP BY `category`,`year` 
ORDER BY `year` DESC, `category`
 

Любая помощь будет очень признательна!

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

1. latest year for each category почему cat1 и cat2 появляются дважды?

2. @user3783243, потому ID что s разные

Ответ №1:

Воспроизвести следующий:

 SELECT 
 ANY_VALUE(`my_table`.`id`) AS `id`, 
 ANY_VALUE(`my_table`.`category`) AS `category`,
 ANY_VALUE(`my_table`.`year`) AS `year` 
FROM `my_table`, (SELECT ANY_VALUE(`category`) AS `category`, MAX(`year`) AS `year` FROM `my_table` GROUP BY `category`) AS `my_table2` 
WHERE 
    `my_table`.`year` = `my_table2`.`year` AND
    `my_table`.`category` = `my_table2`.`category`  
ORDER BY `my_table`.`year` DESC, `my_table`.`category` 
 

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

1. Спасибо! Это дало мне именно то, что мне было нужно, и запрос был очень эффективным. Ваше здоровье!

Ответ №2:

вот запрос MySQL для этого:

 SELECT * FROM TAB T1
WHERE YEAR >= ALL (SELECT YEAR FROM TAB T2 WHERE T2.CATEGORY = T1.CATEGORY);
 

Ответ №3:

Попробуйте выполнить следующий запрос с INNER JOIN :

 SELECT DISTINCT(t1.id), t1.category, t1.year 
FROM my_table t1 
INNER JOIN my_table t2 
ON t1.category = t2.category
WHERE t1.year > t2.year;
 

Этот запрос более эффективен, так как он не включает в себя никаких подзапросов, агрегатных функций или группировки.

Проверьте dbfiddle

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

1. У этого есть одна проблема .

2. Мой запрос действителен для заданных данных. В приведенных данных все категории повторяются.