Como pegar apenas os últimos registros inseridos em cada grupo?
Selecionar o último registro inserido para cada categoria, cliente ou usuário é uma necessidade comum no SQL. Existem diversas maneiras de fazer isso, dependendo do banco de dados utilizado.
1. Usando GROUP BY com MAX()
Se quisermos buscar a data do último pedido de cada cliente:
SELECT cliente_id, MAX(data_pedido) AS ultimo_pedido
FROM pedidos
GROUP BY cliente_id;
Isso retorna a data do pedido mais recente de cada cliente, mas não os detalhes do pedido.
2. Usando subconsulta para pegar os detalhes do último registro
Se quisermos obter todos os detalhes do último pedido de cada cliente:
SELECT * FROM pedidos p1
WHERE data_pedido = (
SELECT MAX(data_pedido) FROM pedidos p2 WHERE p2.cliente_id = p1.cliente_id
);
Aqui, buscamos o pedido mais recente para cada cliente com todas as colunas.
3. Usando ROW_NUMBER() para selecionar o último registro
Se o banco de dados suporta ROW_NUMBER()
, podemos fazer:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY cliente_id ORDER BY data_pedido DESC) AS rn
FROM pedidos
) AS subquery WHERE rn = 1;
Isso numera os pedidos de cada cliente do mais recente para o mais antigo, e seleciona apenas o primeiro.
Quando usar cada técnica?
Técnica | Melhor para |
---|---|
GROUP BY + MAX() | Quando só precisamos da última data ou ID do registro |
Subconsulta com MAX() | Quando precisamos de todos os detalhes do último registro |
ROW_NUMBER() | Quando o banco de dados suporta funções de janela e precisamos de performance |
Cuidados ao selecionar os últimos registros de cada grupo
- Se houver empates, utilize um critério adicional para desempate.
- Para grandes volumes de dados, funções como
ROW_NUMBER()
podem ser mais eficientes. - Verifique índices nas colunas utilizadas para melhorar a performance da consulta.
Quando selecionar os últimos registros de cada grupo no SQL?
Selecionar os últimos registros de cada grupo no SQL é essencial para relatórios e análise de dados. Em sistemas financeiros, podemos buscar a última transação de cada usuário. Em um CRM, podemos listar o último contato feito com cada cliente. A escolha da abordagem correta depende do banco de dados utilizado e da necessidade de desempenho da consulta.
Algumas aplicações:
- Obter o último pedido feito por cada cliente
- Selecionar a última transação financeira de cada usuário
- Listar o último login de cada usuário no sistema
- Encontrar a última mensagem enviada em cada conversa
- Gerar relatórios que mostrem eventos recentes de cada grupo
Dicas para quem está começando
- Se precisar de apenas uma informação por grupo, use
GROUP BY + MAX()
- Para recuperar todos os detalhes do último registro, utilize subconsultas
- Se o banco de dados for compatível,
ROW_NUMBER()
pode ser a melhor opção - Evite consultas que escaneiam toda a tabela sem índices otimizados
- Teste diferentes abordagens para verificar qual possui melhor desempenho no seu banco
Contribuições de Fernando Albuquerque