Como pegar apenas os últimos registros inseridos em cada grupo?

Podemos pegar os últimos registros inseridos de cada grupo no SQL utilizando MAX(), ROW_NUMBER() e subconsultas para segmentar os dados corretamente.

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.

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

Compartilhe este tutorial: Como pegar apenas os últimos registros inseridos em cada grupo?

Compartilhe este tutorial

Continue aprendendo:

Como fazer uma consulta que retorna apenas o primeiro registro de cada grupo?

Podemos retornar apenas o primeiro registro de cada grupo no SQL utilizando técnicas como GROUP BY, ROW_NUMBER e subconsultas.

Tutorial anterior

Como evitar subconsultas muito pesadas no SQL?

Subconsultas muito pesadas podem afetar a performance. Aprenda técnicas para evitá-las e otimizar suas consultas SQL, como o uso de JOINs e índices.

Próximo tutorial