Другой способ получить самую последнюю строку в группе, используя подзапрос, который в основном вычисляет ранг для каждой строки в группе, а затем отфильтровывает ваши последние строки, как с rank = 1
select a.*
from topten a
where (
select count(*)
from topten b
where a.home = b.home
and a.`datetime` < b.`datetime`
) +1 = 1
DEMO
Вот визуальное демо для ранга № для каждой строки для лучшего понимания
Прочитав некоторые комментарии что делать, если есть две строки, которые имеют одинаковые значения полей 'home' и 'datetime'?
Вышеупомянутый запрос не будет выполнен и вернет более 1 строки для вышеуказанной ситуации. Чтобы скрыть эту ситуацию, понадобится другой критерий / параметр / столбец, чтобы решить, какую строку следует взять, которая попадает в вышеуказанную ситуацию. Просматривая пример набора данных, я предполагаю, что есть столбец первичного ключа id
, который должен быть установлен на автоинкремент. Таким образом, мы можем использовать этот столбец, чтобы выбрать самую последнюю строку, настроив тот же запрос с помощью оператора CASE
, например
select a.*
from topten a
where (
select count(*)
from topten b
where a.home = b.home
and case
when a.`datetime` = b.`datetime`
then a.id < b.id
else a.`datetime` < b.`datetime`
end
) + 1 = 1
DEMO
Выше запроса выберет строку с самым высоким идентификатором среди тех же datetime
значений
визуальная демонстрация за ранг № для каждой строки