Voltar para a lista de artigos Artigos
12 minutos de leitura

Perguntas da entrevista sobre o Amazon SQL

Está se preparando para uma entrevista na Amazon? Dê uma olhada nessas perguntas de entrevista e verifique seu conhecimento profissional de SQL!

A preparação para uma entrevista em grandes empresas como a Amazon pode ser cansativa, mas você sempre pode praticar com antecedência e fortalecer suas habilidades em SQL! Neste artigo, examinaremos as perguntas da entrevista sobre SQL da Amazon e ajudaremos você a se preparar para a sua próxima grande entrevista. Deseja dominar todo o SQL e ser aprovado em qualquer tarefa? Nosso curso completo SQL de A a Z, no qual abordamos todos os aspectos do SQL com mais de 850 exercícios, ajudará você a atingir seu objetivo.

Se estiver procurando mais perguntas sobre SQL para entrevistas de emprego, confira nosso artigo Top 100+ SQL Interview Questions and Practice Exercises. Nele, reunimos muitos outros exercícios de SQL para ajudá-lo a se preparar para sua próxima entrevista.

Como funciona uma entrevista de SQL da Amazon?

Você pode se candidatar a uma vaga na Amazon em amazon.jobs e usar a função de pesquisa para encontrar todas as vagas relacionadas a SQL. Você também pode pesquisar palavras-chave relacionadas, como "banco de dados", "ciência de dados" ou "analista", para encontrar cargos semelhantes.

Se a sua candidatura for bem-sucedida e você tiver um currículo relevante, um recrutador entrará em contato com você para uma rápida conversa por telefone. Essa primeira ligação provavelmente não será técnica; o foco será determinar se você se encaixa bem na cultura da empresa. Depois que você passar nessa triagem, começa a entrevista técnica.

Os entrevistadores técnicos da Amazon farão perguntas relacionadas a SQL e dados, além de outras perguntas específicas para o cargo ao qual você se candidatou. As entrevistas de SQL da Amazon são conhecidas por abordarem primeiro os conceitos básicos de sintaxe e, em seguida, aprofundarem-se em JOINs complexos e funções de janela. Você pode praticar esses tópicos com nosso curso Cláusulas JOIN em SQL e nosso extenso curso Window Functions.

Neste artigo, vamos nos concentrar na prática de JOINs e funções de janela. Se quiser atualizar seus conhecimentos sobre os conceitos básicos de SQL, confira nossa lista de perguntas comuns de entrevistas sobre SQL.

Conheça os dados

Para este conjunto de práticas, usaremos duas tabelas simples, salesperson e product. Vamos examinar cada uma delas.

A tabela salesperson armazena informações sobre todos os representantes de vendas da empresa. Cada um deles é identificado com um id (armazenado como um tipo de dado INT) e tem um name (TEXT), um salary (NUMERIC) e um manager_id (INT) opcional. Quando presente, a ID do gerente aponta para o endereço id de outro representante de vendas que supervisiona o vendedor atual.

A tabela product armazena informações sobre os produtos que os vendedores vendem. Cada produto é identificado por seu id (INT) e tem um name (TEXT), price (NUMERIC), category (TEXT) e um salesperson_id (INT) obrigatório. Esse último campo aponta para o ID do representante de vendas que vende o produto.

Agora que já examinamos os dados, vamos começar os exercícios. Pode ser uma boa ideia ter nossas folhas de consulta SQL gratuitas. Nossa Folha de dicasCláusulas JOIN em SQL e Folha de dicasFunções de Janela (Window Functions) em SQL o ajudarão se você precisar de um lembrete rápido sobre a sintaxe de algum comando.

Perguntas, respostas e explicações sobre a entrevista com o Amazon SQL

1. representantes de vendas com altos salários

Tarefa: Encontre todos os vendedores cujo salário é maior do que o de seus gerentes.

Resposta:

SELECT e1.name
FROM salesperson e1
JOIN salesperson e2
  ON e1.manager_id = e2.id
  AND e2.salary < e1.salary;

Explicação:

Para emparelhar cada vendedor com seu gerente, precisamos usar um self-join, ou seja, precisamos unir a tabela com ela mesma. Para um representante de vendas que tenha um gerente, a união na condição de salesperson1.id = salesperson2.manager_id nos dará pares de representantes e seus gerentes. Não há necessidade de um LEFT JOIN aqui, pois estamos procurando especificamente apenas os vendedores que têm um gerente.

Você pode adicionar a condição de filtragem (manager.salary < salesperson.salary) em uma cláusula WHERE ou como uma condição extra na cláusula JOIN (criando uma união não equitativa). Uma união não equitativa pode ser uma boa demonstração de suas habilidades de JOIN, mas aqui o resultado é o mesmo.

Se quiser praticar mais JOIN para sua próxima entrevista, confira nosso curso Cláusulas JOIN em SQL , que o guiará por todos os tipos de JOIN e pela melhor forma de usá-los.

2. produtos mais caros

Tarefa: Para cada produto, conte o número de produtos que são mais caros que ele.

Resposta:

SELECT
  p1.name,
  COUNT(p2.name) AS num_products
FROM product p1
LEFT JOIN product p2
  ON p1.price < p2.price
GROUP BY p1.name;

Explicação:

Essa tarefa pode ser facilmente resolvida com um self-join ou uma subconsulta. Como as entrevistas da Amazon tendem a se apoiar muito em JOINs complicados (e como as consultas JOIN tendem a ser executadas mais rapidamente do que as subconsultas), usaremos outro self-join.

Para pular a filtragem após a união, colocamos a condição product1.price < product2.price na própria união, dentro da cláusula ON. Um LEFT JOIN garante que incluiremos o produto mais caro. O produto mais caro não tem produtos correspondentes com os quais se unir, portanto seria excluído em uma junção normal.

3. produtos acima do salário de um representante

Tarefa: Para cada representante de vendas, mostre quantos produtos que ele vende têm preço superior ao seu salário. Inclua todos os vendedores no resultado, mesmo que eles não vendam esses produtos.

Resposta:

SELECT
  s.id,
  s.name,
  s.salary,
  s.manager_id,
  COUNT(p.name) AS expensive_products
FROM salesperson s
LEFT JOIN product p
  ON s.id = p.salesperson_id
  AND p.price > s.salary
GROUP BY
  s.id,
  s.name,
  s.salary,
  s.manager_id;

Explicação:

Unir product e salesperson. Para contar apenas os produtos que custam mais do que o salário do representante de vendas, use a condição de filtragem p.price > s.salary. Talvez você queira colocá-la na cláusula WHERE após JOIN, mas a maioria dos representantes não tem produtos tão caros e a condição de filtragem eliminará todos eles. Em vez disso, coloque essa condição como uma condição adicional ao unir as duas tabelas e use um LEFT JOIN.

Se um vendedor não tiver nenhum produto que custe mais do que seu salário, ele ainda será mantido no resultado final pelo LEFT JOIN. Sua contagem expensive_products terá o valor 0.

Se quiser saber mais sobre quando usar non-equi JOINs, confira estes exemplos detalhados de non-equi JOIN.

4. preço do produto por categoria

Tarefa: Para cada produto, descubra como seu preço se compara ao preço médio de outros produtos da categoria. Mostre o nome e o preço do produto, juntamente com o preço médio de todos os outros produtos da mesma categoria.

Resposta:

SELECT
  p1.name,
  p1.price,
  AVG(p2.price) AS avg_price_in_category
FROM product p1
JOIN product p2
  ON p1.category = p2.category
  AND p1.id != p2.id
GROUP BY
  p1.name,
  p1.price;

Explicação:

Para calcular o preço médio de todos os outros produtos da mesma categoria, você deve criar pares como este: produto - outro produto da mesma categoria. Para fazer isso, faça a autojunção da tabela de produtos na categoria do produto. Isso incluirá linhas em que o produto é unido a ele mesmo, portanto, uma condição extra precisa ser adicionada em JOIN: product1.name != product2.name. (Isso também pode ser feito na cláusula WHERE.)

Agora, com todos os pares de produtos completos, podemos calcular a média do preço do segundo produto do par e agrupar pelo primeiro produto. Isso produzirá o resultado desejado.

5) Salário médio do vendedor

Tarefa: Mostrar todos os dados do representante de vendas, bem como uma coluna com o salário médio de todos os representantes e a diferença entre o salary desse vendedor e o average_salary de todos os representantes.

Resposta:

SELECT 
  id,
  name,
  salary,
  manager_id,
  AVG(salary) OVER() AS average_salary,
  salary - AVG(salary) OVER() AS salary_difference
FROM salesperson;

Explicação:

Para obter o salário médio de todos os vendedores, usaremos a função de janela AVG(). Ela funciona da mesma forma que a função agregada AVG(), mas para torná-la uma função de janela, usamos OVER() em vez de GROUP BY.

Use uma cláusula OVER() vazia para obter o valor médio do salário de todos os vendedores. Nomeie a coluna average_salary para maior clareza. Subtraia o salário de cada representante de vendas (que é diferente para cada linha) de average_salary (que é o mesmo para cada linha) para obter a diferença salarial de cada representante. Dê a isso o nome de salary_difference.

Se você quiser praticar mais funções de janela, confira nosso curso Funções de Janela (Window Functions) em SQL . Ele oferece mais de 200 exercícios interativos para que você possa conhecer as funções de janela em detalhes!

6. preços relativos de produtos

Tarefa: Para cada produto, mostre a relação entre seu preço e o preço do produto mais caro da categoria.

Resposta:

SELECT
  name,
  price,
  price / MAX(price) OVER(PARTITION BY category) AS price_ratio
FROM product;

Explicação:

Para calcular a proporção entre o preço do produto atual e o preço do produto mais caro na mesma categoria, precisamos usar esta fórmula: ratio = price / (max price from the same category).

Não podemos usar o GROUP BY aqui, pois ele reduz as linhas individuais; em vez disso, usamos a função de janela MAX(). Diferentemente do último exercício, aqui especificaremos explicitamente a partição. Queremos obter um resultado separado para cada categoria, portanto, a sintaxe que usaremos será: PARTITION BY category. Coloque-a na cláusula OVER(), que vem logo após a função de janela MAX().

7 Classificação dos preços dos produtos nas categorias

Tarefa: Mostrar como o preço de cada produto está classificado em sua categoria. Mostre o nome, o preço e a categoria de cada produto junto com a classificação de preço. O produto mais caro em sua categoria deve estar em primeiro lugar e o produto mais barato deve estar em último.

Resposta:

SELECT
  name,
  price,
  category,
  ROW_NUMBER() OVER(PARTITION BY category ORDER BY price DESC) AS category_rank
FROM product

Explicação:

Para criar uma classificação para cada linha dentro de sua categoria, precisamos usar funções de janela de classificação. Há algumas opções: RANK() DENSE_RANK() ROW_NUMBER() Embora elas possam fornecer resultados diferentes em alguns casos, nesse caso, qualquer uma delas funcionará. Você pode saber mais sobre as diferenças entre essas três funções em nossa visão geral das funções de classificação do SQL.

Para este exemplo, usaremos ROW_NUMBER(). Ela retornará o número de cada linha em sua categoria, sem pular ou repetir números quando os produtos tiverem a mesma classificação.

Usamos ROW_NUMBER() juntamente com OVER() para especificar o tamanho da janela e a ordem em que as linhas são classificadas. PARTITION BY category define a janela para todos os produtos da mesma categoria da linha atual. Isso garante que somente os produtos da mesma categoria sejam considerados para o cálculo da classificação. Em seguida, ORDER BY price DESC define a ordem de classificação (os produtos com preços maiores serão classificados em uma posição mais alta).

8. representantes mais bem pagos dos gerentes

Tarefa: Entre os representantes de vendas que se reportam a um gerente, mostre quais são os mais bem pagos. Em outras palavras: para cada gerente com subordinados, mostre o subordinado mais bem pago, mas não o próprio gerente.

Resposta:

WITH salesperson_with_highest_salary as (
  SELECT
    id,
    name,
    salary,
    manager_id,
    MAX(salary) OVER (PARTITION BY manager_id) AS highest_salary
  FROM salesperson
)
SELECT *
FROM salesperson_with_highest_salary
WHERE salary = highest_salary;

Explicação:

Primeiro, criaremos um resultado intermediário: para cada vendedor, encontraremos seu ID, nome, salário, ID do gerente e o salário mais alto entre seus colegas (ou seja, representantes que compartilham o mesmo gerente). Usamos a função de janela MAX() juntamente com OVER (PARTITION BY manager_id) para encontrar o salário mais alto por grupo de representantes com o mesmo manager_id.

Observe que envolvemos a consulta em uma expressão de tabela comum (CTE). Uma CTE começa com a palavra-chave WITH e um nome. Ele dá esse nome a esses resultados intermediários, que podem ser referenciados posteriormente na consulta principal.

Aqui, o CTE tem o nome de salesperson_with_highest_salary. Se você precisar de um lembrete sobre como os CTEs funcionam, consulte nosso guia de expressões de tabela comuns em SQL. Para uma abordagem mais aprofundada, experimente nosso curso Common Table Expressions (Expressões comuns de tabela).

Só precisamos mostrar os representantes de vendas que são os mais bem pagos em seu grupo. Agora que você tem o endereço salary do representante junto com o highest_salary do grupo, pode filtrar os vendedores na consulta externa para mostrar apenas os que têm o mesmo salário que o salário mais alto do grupo. Se dois ou mais representantes em um grupo tiverem o salário mais alto, todos eles serão mostrados no resultado final.

9. produtos mais caros por categoria

Tarefa: Em cada categoria, encontre os três produtos de preço mais alto. Se vários produtos tiverem o mesmo preço, inclua todos eles.

Resposta:

WITH product_ranks AS (
  SELECT
  name,
  price,
  category,
  DENSE_RANK() OVER (PARTITION BY category ORDER BY price DESC) AS rank
  FROM Product
)
SELECT * 
FROM product_ranks
WHERE rank <= 3;

Explicação:

Usamos novamente uma função de janela dentro de um CTE. Dessa vez, precisamos criar uma classificação adicional para cada linha dentro de sua categoria. Precisamos usar DENSE_RANK() para isso; ele retornará todos os produtos com os três preços mais altos, mesmo que alguns produtos tenham o mesmo preço.

Use PARTITION BY category para obter uma classificação separada dentro de cada categoria e ORDER BY price DESC para garantir que os produtos com preços mais altos obtenham as classificações mais altas. Envolva a consulta que encontra a classificação de cada linha em um CTE para que a classificação fique disponível ao filtrar as linhas. Qualquer linha com a classificação 1, 2 ou 3 está entre os três principais produtos de sua categoria; use isso como uma condição de filtragem na consulta externa para obter o resultado final.

Pronto para sua entrevista sobre o Amazon SQL?

Muito bem! Se você conseguiu resolver todas as tarefas da nossa preparação para a entrevista com o Amazon SQL, pode ter certeza de que possui habilidades avançadas em SQL. Boa sorte em sua próxima entrevista!

Está procurando perguntas mais complexas para praticar em uma entrevista sobre SQL? Dê uma olhada nestas 15 perguntas complicadas para entrevistas que combinam tópicos teóricos e práticos de SQL. E se você estiver procurando uma variedade maior de exercícios práticos, nosso SQL Avançado Practice Track tem mais de 350. Boa prática!