Uma maneira de fazer isso que usa corretamente
group by
:select l.*
from table l
inner join (
select
m_id, max(timestamp) as latest
from table
group by m_id
) r
on l.timestamp = r.latest and l.m_id = r.m_id
order by timestamp desc
Como isso funciona:
- seleciona o carimbo de data/hora mais recente para cada
m_id
distinto na subconsulta - seleciona apenas linhas da
table
que correspondem a uma linha da subconsulta (esta operação -- onde uma junção é realizada, mas nenhuma coluna é selecionada da segunda tabela, ela é usada apenas como um filtro -- é conhecida como "semijoin" caso você tenha curiosidade) - ordena as linhas