Conjunto completo de problemas de entrevista simulada
Problemas completos com tempo limitado que combinam junções, funções de janela e CTEs em condições de entrevista.
Conjunto completo de problemas de entrevista simulada é uma aula grátis de Coding 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
Como funciona uma rodada de entrevista de SQL
Este projeto final conduz você por problemas simulados completos que combinam junções, funções de janela e CTEs em condições de entrevista. Primeiro, a habilidade mais ampla: como se comportar durante a entrevista.
- Reformule o problema e confirme o esquema.
- Esclareça os casos extremos (NULLs, empates, duplicatas) antes de programar.
- Narre sua abordagem e depois escreva a consulta.
- Teste mentalmente usando uma amostra pequena.
Os entrevistadores avaliam seu processo tanto quanto sua consulta final.
O esquema compartilhado
Todos os problemas abaixo usam este pequeno esquema de comércio eletrônico. Leia-o uma vez para que cada consulta faça sentido.
customers(id, name, country)orders(id, customer_id, order_date, status, amount)order_items(order_id, product_id, quantity)products(id, name, category, price)
Tenha isso em mente; o restante da lição faz referência a essas tabelas.
-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currencyProblema 1: melhores clientes por gasto
“Retorne os 3 clientes com maior gasto total pago, com o nome e o total de cada um.”
Abordagem: filtre os pedidos pagos, agregue por cliente, ordene e aplique LIMIT. Declare que você exclui pedidos cancelados e pendentes, um caso extremo que os entrevistadores inserem de propósito.
SELECT c.name,
SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY total_spend DESC
LIMIT 3;Problema 2: clientes que nunca fizeram pedidos
“Liste os clientes que nunca fizeram um pedido.” Este é o padrão de anti-junção. Duas soluções simples: LEFT JOIN com IS NULL ou NOT EXISTS.
Prefira NOT EXISTS porque ele é seguro com NULL (ao contrário de NOT IN). Mencione essa diferença; é exatamente isso que o entrevistador quer descobrir.
-- NULL-safe anti-join
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);Problema 3: segundo maior valor de pedido
“Encontre o segundo maior valor distinto de pedido.” A solução mais simples e à prova de empates usa DENSE_RANK, para que valores duplicados compartilhem a mesma classificação.
Um caso extremo a mencionar: se não houver um segundo valor distinto, nenhuma linha será retornada. Isso pode ser aceitável ou pode exigir um invólucro com COALESCE, dependendo dos requisitos.
SELECT amount
FROM (
SELECT amount,
DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
FROM orders
) ranked
WHERE rnk = 2;Problema 4: pedido mais recente por cliente
“Retorne o pedido mais recente de cada cliente.” Este é o padrão de manter a linha mais recente por chave, resolvido com ROW_NUMBER particionado por cliente e ordenado pela data em ordem decrescente.
Adicione um critério de desempate (ID do pedido) para que o resultado seja determinístico quando dois pedidos tiverem a mesma data, um detalhe incluído pelos candidatos mais fortes.
SELECT customer_id, id AS order_id, order_date, amount
FROM (
SELECT o.*,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC, id DESC
) AS rn
FROM orders o
) t
WHERE rn = 1;Problema 5: crescimento mês a mês
“Calcule a receita mensal paga e sua variação percentual em relação ao mês anterior.” Isso combina uma agregação em uma CTE com LAG.
Na primeira etapa, agregue por mês; na segunda, compare cada mês com o anterior usando LAG. Proteja a divisão para que o primeiro mês (sem mês anterior) não gere um erro.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS mth,
SUM(amount) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY DATE_TRUNC('month', order_date)
)
SELECT mth,
revenue,
LAG(revenue) OVER (ORDER BY mth) AS prev_revenue,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY mth))
/ NULLIF(LAG(revenue) OVER (ORDER BY mth), 0), 2
) AS pct_change
FROM monthly
ORDER BY mth;Problema 6: melhor produto por categoria
“Para cada categoria, retorne o produto mais vendido pela quantidade total.” Este é o padrão de obter os N melhores por grupo: agregue, classifique dentro da partição e filtre pela classificação 1.
Se os empates forem importantes, troque ROW_NUMBER por RANK para que todos os líderes empatados apareçam. Explicar essa escolha mostra que você entende a diferença.
WITH sales AS (
SELECT p.category,
p.name AS product,
SUM(oi.quantity) AS qty
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.category, p.name
)
SELECT category, product, qty
FROM (
SELECT s.*,
ROW_NUMBER() OVER (
PARTITION BY category ORDER BY qty DESC
) AS rn
FROM sales s
) r
WHERE rn = 1;Problema 7: total acumulado da receita
“Mostre o total acumulado da receita paga por dia.” Uma janela SUM com um enquadramento ordenado produz o total acumulado sem uma autojunção.
Mencione o enquadramento com ROWS para obter um acumulado realmente linha a linha; o enquadramento RANGE padrão pode se comportar de modo inesperado com datas empatadas.
SELECT order_date,
SUM(daily) OVER (
ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM (
SELECT order_date, SUM(amount) AS daily
FROM orders
WHERE status = 'paid'
GROUP BY order_date
) d
ORDER BY order_date;Problema 8: dias consecutivos de atividade
“Encontre usuários com pelo menos 3 dias consecutivos contendo um pedido pago.” Esta é uma variação do problema de lacunas e ilhas que usa o truque da diferença dos números de linha.
Subtrair um número de linha por usuário da data produz uma constante dentro de uma sequência consecutiva; assim, você agrupa por essa constante e faz a contagem. Isso é um sinal de conhecimento de nível sênior.
WITH days AS (
SELECT DISTINCT customer_id, order_date
FROM orders WHERE status = 'paid'
),
grp AS (
SELECT customer_id, order_date,
order_date - (ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY order_date
) * INTERVAL '1 day') AS island
FROM days
)
SELECT customer_id, COUNT(*) AS streak_len
FROM grp
GROUP BY customer_id, island
HAVING COUNT(*) >= 3;Desempenho e armadilhas comuns
Depois de uma consulta correta, os entrevistadores perguntam “como você a tornaria mais rápida?” e observam se você cai em armadilhas clássicas. Tenha uma lista de verificação pronta:
- Crie índices nas colunas de junção e de filtro (por exemplo,
orders(customer_id, status)); evite funções em colunas indexadas no WHERE. - Prefira EXISTS a IN para antijunções grandes;
NOT INcom um NULL retorna silenciosamente zero linhas. - Filtrar uma coluna de uma junção externa em WHERE faz com que ela se torne silenciosamente uma junção interna.
- Sempre adicione um critério de desempate para que os resultados dos N melhores sejam determinísticos.
- Verifique o plano EXPLAIN em busca de varreduras sequenciais em tabelas grandes.
Verificação rápida
Você precisa do único pedido mais recente de cada cliente, e dois pedidos podem ter a mesma data.
Recapitulação: conjunto completo de entrevistas simuladas
Você resolveu, de ponta a ponta, os problemas de entrevista mais frequentes:
- Agregação + LIMIT para obter os N maiores gastos.
- Antijunções com NOT EXISTS (seguras com NULL).
- DENSE_RANK para o N-ésimo maior, ROW_NUMBER para o mais recente por chave e o melhor por grupo.
- LAG para comparações mês a mês, SUM OVER para totais acumulados.
- O truque dos números de linha para lacunas e ilhas, usado em sequências.
- Conclua cada resposta discutindo índices, EXPLAIN e armadilhas comuns.
Perguntas Frequentes
A aula “Conjunto completo de problemas de entrevista simulada” é grátis?
Sim — o texto completo de “Conjunto completo de problemas de entrevista simulada” é 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “Conjunto completo de problemas de entrevista simulada”?
Problemas completos com tempo limitado que combinam junções, funções de janela e CTEs em condições de entrevista. Você pratica Coding 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 Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding 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 “Conjunto completo de problemas de entrevista simulada”?
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 Coding Interview Prep?
Sim. Cada aula de Coding 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
- Normalização até a 3FN
- Modelagem ER e cardinalidade de relacionamentos
- Esquema estrela e projeto de armazém de dados
- Conjunto completo de problemas de entrevista simulada