@igsavenko

Как корректно организовать запрос с Group BY и агрегатной функцией MAX?

Добрый день,
У меня есть вопрос, как сгруппировать строки по второй колонке (column_2) с максимальным временем.
Пример данных:
93b937fe613e46c595c7e9a1ceaf84d9.png
Если использовать такой запрос,
SELECT *, MAX(updated_time) as max_time
	FROM table GROUP BY column_2;

То результат будет следующий:
7c04b28db590448089035e1c9172f532.png

Я понимаю, что как-то нужно правильно использовать having так как ограничения накладывать нужно на группу. Но как, понять не могу. (Updated: А может и не надо). Что-то я запутался, подскажите пожалуйста.

Уточню что в результате должно получиться:
308a9cb615844a8bbd4429fcdd8ead19.png

Мне нужно получить записи для каждой column_2 - уникальных (с группированных по column2), с самым последнем временем обновления.
  • Вопрос задан
  • 2437 просмотров
Решения вопроса 2
svd71
@svd71
. При группировке невозможно использовать ×. Иначе нужное поле будет исключено из группировки. Из этого вытекает, что col1 и col3 не исользуются в группировке и должны быть исключены из запроса.

Но если очень хочется, то можно сделать так:
Select *, (select update-time from table t2 where t2.column_2=t1.column_2 order by update_time desc  limit 1) as max_time 

From table t1


Это очень просто. Группировка идет по тем полям, указынным в выражении group by. Все остальные (если они требуются) должны быть агрегатными: sum, avg, max, min и т.д. То есть запрос берет повторяющиеся значения по group by и проводит по ним операции с аграгатмыми выражениями. having дает возможност использовать такое агрегатное выражение в условии (если оно требуется).

Я тут почесал тыковку немножко и понял, что ван не хватает для получения одного набора из другого. ни group by, ни having совсем не нужны.

Select *, update_time as max_time
From table t1
where
  update_time = (select update_time from table t2 where t2.column_2=t1.column_2 order by update_time desc limit 1)

или
Select *, update_time as max_time
From table t1
where
  update_time = (select max(update_time) from table t2 where t2.column_2=t1.column_2 )


скорость обравотки группировок обычно ниже, чем простой селек о ордер. поэтому первый запрос немного быстрее - просто берем список по условию, сортируем его в нужном порядке и выбираем только первую запись. Так мы получаем довольно быстрый max или min.
Ответ написан
Vakiliy
@Vakiliy
Можно так:
SELECT a.* 
FROM t1 AS a 
   JOIN (
      SELECT c2, MAX(update_time) AS max_time 
      FROM t1 GROUP BY c2
  ) AS b 
  ON a.update_time = b.max_time AND a.c2 = b.c2;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы