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+.
Quando retornar apenas o primeiro registro de cada grupo no SQL?
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