Tenho uma tabela (ainda no MySQL 5.7) com muitos dados. Esta tabela é escrita por alguns scripts. Funciona como um “checkin”, onde cada agente faz o check-in em algum período de tempo. Parece abaixo.
eu ia | agente | status | carimbo de data/hora |
---|---|---|---|
1 | Tom | OK | 16/03/2023 12:27:03 |
2 | Jeff | degradado | 31/08/2023 00:01:13 |
100 | Tom | OK | 03/10/2023 12:00:00 |
101 | Jeff | OK | 03-10-2023 11:59:00 |
Eu gostaria de escolher a linha mais recente de cada agente. Portanto, no exemplo acima, gostaria de obter as linhas 100 e 101.
Eu uso o seguinte script, mas acontece apenas as duas primeiras linhas. Tentei alterar a ordem por id ou carimbo de data/hora ASC/DESC.
SELECT * FROM (SELECT * FROM db_table ORDER BY timestamp ASC) as agnt GROUP BY agent
Como fazer funcionar?
Existem inúmeras maneiras de resolver esse tipo de problema. Normalmente uso uma função de janela para
ROW_NUMBER()
enumerar as linhas por um critério de classificação específico. Em seguida, você pode selecionar apenas as linhas desejadas usando essa enumeração.Infelizmente no MySQL 5.7 e anteriores, as funções de janela não existem, então uma solução alternativa é usar uma subconsulta correlacionada como esta:
Observe que isso só funciona se
timestamp
não estiver duplicado para o mesmoagent
na tabela.