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.

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

No SQL, podemos precisar retornar apenas o primeiro registro de cada grupo, como o primeiro pedido de cada cliente ou o primeiro acesso de um usuário.

1. Usando GROUP BY e MIN()

Se quisermos retornar o pedido mais antigo de cada cliente:

SELECT cliente_id, MIN(data_pedido) AS primeiro_pedido 
FROM pedidos 
GROUP BY cliente_id;

Essa consulta retorna a data do primeiro pedido de cada cliente, mas não inclui outros detalhes do pedido.

2. Usando subconsulta para buscar o primeiro registro de cada grupo

Se quisermos obter todos os dados do primeiro pedido de cada cliente:

SELECT * FROM pedidos p1 
WHERE data_pedido = (
    SELECT MIN(data_pedido) FROM pedidos p2 WHERE p2.cliente_id = p1.cliente_id
);

Aqui, buscamos o pedido mais antigo de cada cliente com todas as colunas.

3. Usando ROW_NUMBER() (para bancos compatíveis)

Se o banco de dados suporta ROW_NUMBER(), podemos fazer:

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY cliente_id ORDER BY data_pedido ASC) AS rn 
    FROM pedidos
) AS subquery WHERE rn = 1;

Isso numera os pedidos de cada cliente e seleciona apenas o primeiro.

Quando usar cada técnica?

Técnica Melhor para
GROUP BY + MIN() Quando apenas a data ou ID do primeiro registro for necessária
Subconsulta com MIN() Quando precisamos de todos os detalhes do primeiro registro
ROW_NUMBER() Quando o banco de dados suporta funções de janela e precisamos de performance

Cuidados ao buscar o primeiro registro de cada grupo

  • Se houver empates, escolha um critério adicional de desempate.
  • Em tabelas grandes, técnicas sem índice podem ser lentas.
  • **ROW_NUMBER() pode ser mais eficiente em bancos modernos como PostgreSQL, SQL Server e MySQL 8+.

Selecionar apenas o primeiro registro de cada grupo é uma técnica essencial para criar relatórios e análises organizadas no SQL. Em um banco de dados de pedidos, podemos usá-la para saber a primeira compra de cada cliente. Em um sistema de acessos, podemos identificar o primeiro login de um usuário. A escolha da abordagem correta depende do banco de dados utilizado e do desempenho desejado.

Algumas aplicações:

  • Obter a primeira compra de cada cliente
  • Selecionar o primeiro acesso de um usuário
  • Listar o primeiro produto vendido em cada categoria
  • Encontrar a primeira mensagem enviada em cada conversa
  • Gerar relatórios que mostrem eventos iniciais de cada grupo

Dicas para quem está começando

  • Se precisar de apenas um valor por grupo, use GROUP BY + MIN()
  • Para recuperar todos os detalhes do primeiro 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 Rodrigo Martins

Compartilhe este tutorial: Como fazer uma consulta que retorna apenas o primeiro registro de cada grupo?

Compartilhe este tutorial

Continue aprendendo:

Como utilizar subconsultas correlacionadas no SQL?

Subconsultas correlacionadas no SQL são consultas dependentes da linha atual da consulta principal, permitindo análises mais dinâmicas.

Tutorial anterior

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.

Próximo tutorial