Contando e filtrando grupos
Encontre grupos que atendem a um limite, como na pergunta clássica sobre clientes com mais de N pedidos.
Contando e filtrando grupos é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
A Pergunta de Agrupamento Mais Comum
“Encontre clientes com mais de N pedidos” é o problema clássico de GROUP BY em entrevistas. Variações aparecem constantemente: produtos vendidos mais de X vezes, departamentos com pelo menos Y funcionários, dias com mais de Z acessos.
Todos seguem o mesmo padrão: agrupar, contar e depois filtrar os grupos com HAVING.
Etapa Um: Contar por Grupo
Comece contando as linhas dentro de cada grupo. Agrupe pela chave que define um “cliente” ou “produto” e aplique COUNT(*).
Isso fornece uma linha por grupo com seu tamanho. Você ainda não filtrou nada; está apenas medindo cada grupo.
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;Etapa Dois: Filtrar com HAVING
Agora mantenha apenas os grupos que atingem o limite. A condição é baseada em um agregado, portanto deve ficar em HAVING, não em WHERE.
Interprete assim: “agrupe os pedidos por cliente e, depois, mantenha os clientes cuja contagem seja maior que cinco”. Essa é a resposta completa para a pergunta clássica.
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;Contagem Distinta versus Contagem Total
Preste atenção à formulação. “Clientes que pediram mais de 3 produtos diferentes” exige COUNT(DISTINCT product_id), não COUNT(*).
COUNT(*)conta as linhas do grupo.COUNT(DISTINCT col)conta os valores exclusivos não NULL.
Entrevistadores inserem “diferentes” ou “exclusivos” na pergunta para verificar se você recorre a DISTINCT.
SELECT customer_id, COUNT(DISTINCT product_id) AS distinct_products
FROM orders
GROUP BY customer_id
HAVING COUNT(DISTINCT product_id) > 3;Filtragem por SUM em Vez de COUNT
A mesma estrutura trata somas. “Clientes que gastaram mais de 1000 no total” agrupa por cliente e filtra por SUM(amount).
Qualquer agregado pode determinar a condição de HAVING: COUNT, SUM, AVG, MAX, MIN. Identificar a medida solicitada na pergunta indica qual agregado usar no filtro.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;Várias Condições de Grupo
HAVING pode combinar condições com AND/OR, inclusive agregados diferentes. “Clientes com mais de 5 pedidos E média dos pedidos acima de 100” corresponde a uma única cláusula HAVING.
Cada condição faz referência ao seu próprio agregado; todas são avaliadas depois do agrupamento. Isso demonstra que você consegue expressar regras de negócio compostas de forma clara.
SELECT customer_id,
COUNT(*) AS orders,
AVG(amount) AS avg_order
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5 AND AVG(amount) > 100;Combine WHERE e HAVING
Muitas vezes, você precisa filtrar as linhas antes de fazer a contagem. “Entre os pedidos deste ano, clientes com mais de 5 pedidos” usa WHERE para a data e HAVING para a contagem.
WHERE reduz as linhas primeiro; depois, o agrupamento e o limite de HAVING são aplicados. Acertar ambas as cláusulas em uma única consulta é um sinal de nível intermediário.
SELECT customer_id, COUNT(*) AS orders_this_year
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) > 5;Encontrando Duplicatas
Um caso muito próximo: “encontre e-mails duplicados”. Agrupe pela coluna que deveria ser exclusiva e mantenha os grupos cuja contagem seja maior que um.
Esse único padrão detecta chaves duplicadas, transações repetidas ou qualquer valor que apareça mais vezes do que deveria. Entrevistadores fazem essa pergunta para verificar se você enxerga o agrupamento como uma ferramenta de deduplicação.
SELECT email, COUNT(*) AS times_seen
FROM users
GROUP BY email
HAVING COUNT(*) > 1;Grupos que atingem uma contagem exata
Os limites nem sempre são de “maior que”. “Clientes com exatamente um pedido” usa HAVING COUNT(*) = 1; “pelo menos 3” usa >= 3.
Preste atenção à palavra que indica o limite no enunciado: “mais de”, “pelo menos”, “exatamente”, “menos de”. Cada uma corresponde a um operador de comparação diferente, e os entrevistadores avaliam essa precisão.
-- One-time customers
SELECT customer_id, COUNT(*) AS orders
FROM orders
GROUP BY customer_id
HAVING COUNT(*) = 1;Retornar apenas as chaves
Às vezes, o enunciado pede apenas os identificadores que atendem ao critério, não as contagens, geralmente para alimentar outra consulta. Você ainda agrupa e filtra, mas faz SELECT apenas da chave.
Você pode então envolver isso em uma subconsulta IN ou em uma junção para buscar os registros completos desses clientes. Conhecer essa composição é um diferencial de alguém sênior.
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;Guia para entrevistas
Para qualquer pergunta sobre “grupos que atendem a um limite”, siga estes quatro passos em voz alta: (1) identifique a chave de agrupamento, (2) escolha a medida agregada, (3) decida o operador de comparação com base na formulação, (4) coloque os filtros de linhas em WHERE e o filtro de agregação em HAVING.
Este modelo resolve toda a família de problemas de contagem e filtragem.
Verificação rápida
Escolha a consulta correta para o enunciado.
Recapitulação
Padrão: agrupe pela chave, faça a agregação e filtre os grupos com HAVING. Isso resolve “mais de N pedidos”, “clientes que mais gastam”, duplicatas e clientes de uma única compra.
- Use
COUNT(*)para linhas,COUNT(DISTINCT col)para valores únicos. - Associe o operador de comparação à formulação do enunciado.
- Os filtros de linhas ficam em WHERE; os filtros de agregação, em HAVING.
- Selecione apenas a chave para alimentar uma subconsulta IN ou uma junção.
Perguntas Frequentes
A aula “Contando e filtrando grupos” é grátis?
Sim — o texto completo de “Contando e filtrando grupos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “Contando e filtrando grupos”?
Encontre grupos que atendem a um limite, como na pergunta clássica sobre clientes com mais de N pedidos. Você pratica SQL Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Interview Prep?
Nenhuma experiência prévia é necessária. SQL Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Contando e filtrando grupos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Interview Prep?
Sim. Cada aula de SQL Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- A regra de GROUP BY para colunas SELECT
- HAVING versus WHERE
- Agrupando por várias colunas e expressões
- Contando e filtrando grupos