SQL Interview Prep · Aula

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.

Aula 4 de 413 etapas

Conjunto completo de problemas de entrevista simulada é 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.

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 currency

Problema 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 IN com 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.
Grátis para começar

Aprenda SQL com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
30
Aulas
120

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 SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL 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 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 “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 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

  1. Normalização até a 3FN
  2. Modelagem ER e cardinalidade de relacionamentos
  3. Esquema estrela e projeto de armazém de dados
  4. Conjunto completo de problemas de entrevista simulada
← Voltar para SQL Interview Prep