Volver a la lista de artículos Artículos
Lectura de 12 minutos

Preguntas de la entrevista de Amazon SQL

¿Te estás preparando para una entrevista en Amazon? Echa un vistazo a estas preguntas de entrevista y comprueba tus conocimientos profesionales de SQL.

La preparación de una entrevista para grandes empresas como Amazon puede resultar abrumadora, pero siempre puedes practicar de antemano y reforzar tus conocimientos de SQL. En este artículo, repasaremos las preguntas de la entrevista SQL de Amazon y te ayudaremos a prepararte para tu próxima gran entrevista. ¿Quieres dominar todo el lenguaje SQL y dominar cualquier tarea? Nuestro completo cursoCurso completo de SQL , en el que cubrimos cada rincón de SQL con más de 850 ejercicios, te ayudará a alcanzar tu objetivo.

Si buscas más preguntas de SQL para entrevistas de trabajo, echa un vistazo a nuestro artículo Top 100+ SQL Interview Questions and Practice Exercises. En él, hemos recopilado muchos otros ejercicios de SQL que te ayudarán a prepararte para tu próxima entrevista.

¿Cómo funciona una entrevista SQL en Amazon?

Puedes solicitar un puesto en Amazon en amazon.jobs y utilizar la función de búsqueda para encontrar todos los puestos relacionados con SQL. También puedes buscar palabras clave relacionadas como "base de datos", "ciencia de datos" o "analista" para encontrar puestos similares.

Si tu solicitud es aceptada y tienes un CV relevante, un reclutador se pondrá en contacto contigo para mantener una rápida conversación telefónica. Lo más probable es que esta primera llamada no sea técnica, sino que se centre en determinar si encajas en la cultura de la empresa. Una vez superado este filtro, comienza la entrevista técnica.

Los entrevistadores técnicos de Amazon le harán preguntas relacionadas con SQL y datos, así como otras preguntas específicas del puesto que ha solicitado. Las entrevistas SQL de Amazon son conocidas por cubrir primero los conceptos básicos de sintaxis y luego profundizar en JOINs complejos y funciones de ventana. Puedes practicar estos temas con nuestro curso Tipos de JOIN en SQL y nuestro extenso curso de Window Functions.

En este artículo, nos centraremos en la práctica de JOINs y funciones ventana. Si desea refrescar sus conocimientos sobre los conceptos básicos de SQL, consulte nuestra lista de preguntas comunes en las entrevistas SQL.

Conozca los Datos

Para esta práctica, utilizaremos dos tablas simples, salesperson y product. Examinemos cada una de ellas.

La tabla salesperson almacena información sobre todos los comerciales de la empresa. Cada uno se identifica con un id (almacenado como un tipo de dato INT), y tiene un name (TEXTO), un salary (NUMÉRICO), y un manager_id opcional (INT). Cuando está presente, el ID del gerente apunta a id de otro representante de ventas que supervisa al vendedor actual.

La tabla product almacena información sobre los productos que venden los vendedores. Cada producto se identifica por su id (INT) y tiene un name (TEXTO), price (NUMÉRICO), category (TEXTO) y un salesperson_id (INT) obligatorio. Este último campo apunta al id del comercial que vende el producto.

Ahora que ya hemos visto los datos, empecemos con los ejercicios. Tener nuestras hojas de trucos SQL gratuitas puede ser una buena idea. Nuestra Tipos de JOIN en SQL Cheat Sheet y Funciones de ventana Cheat Sheet te ayudarán si necesitas un recordatorio rápido sobre la sintaxis de algún comando.

Preguntas, respuestas y explicaciones de la entrevista SQL de Amazon

1. Representantes de ventas con altos ingresos

Tarea: Encontrar todos los vendedores cuyo salario es mayor que el de sus jefes.

Respuesta:

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

Explicación:

Para emparejar a cada vendedor con su jefe, tenemos que utilizar una autounión, es decir, tenemos que unir la tabla consigo misma. Para un representante de ventas que tiene un jefe, la unión en la condición de salesperson1.id = salesperson2.manager_id nos dará pares de representantes y sus jefes. No es necesario utilizar LEFT JOIN, ya que sólo buscamos a los vendedores que tienen un jefe.

Puede añadir la condición de filtrado (manager.salary < salesperson.salary) en una cláusula WHERE o como condición adicional en la cláusula JOIN (creando una unión no equitativa). Una unión no-equi puede ser una buena demostración de sus habilidades en JOIN, pero aquí el resultado es el mismo.

Si quiere practicar más JOIN para su próxima entrevista, consulte nuestro curso Tipos de JOIN en SQL , que le guiará a través de todos los tipos de JOIN y cómo utilizarlos mejor.

2. Productos más caros

Tarea: Para cada producto, cuente el número de productos que son más caros que él.

Respuesta:

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;

Explicación:

Esta tarea se puede resolver fácilmente con una auto-unión o una subconsulta. Como las entrevistas de Amazon tienden a inclinarse mucho por JOINs complicados (y como las consultas JOIN tienden a ejecutarse más rápido que las subconsultas), utilizaremos otro self-join.

Para omitir el filtrado después de la unión, ponemos la condición product1.price < product2.price en la propia unión, dentro de la cláusula ON. LEFT JOIN garantiza que se incluya el producto más caro. El producto más caro no tiene productos correspondientes con los que unirse, por lo que se excluiría en un JOIN normal.

3. Productos por encima del salario de un representante

Tarea: Para cada representante de ventas, muestre cuántos productos venden que tienen un precio superior a su salario. Incluya a todos los vendedores en el resultado, aunque no vendan dichos productos.

Respuesta:

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;

Explicación:

Una product y salesperson. Para contar sólo los productos que cuestan más que el salario del representante de ventas, utilice la condición de filtrado p.price > s.salary. Podría colocarla en la cláusula WHERE después de la JOIN, pero la mayoría de los representantes no tienen productos tan caros y la condición de filtrado se deshará de todos ellos. En su lugar, ponga esta condición como una adicional al unir las dos tablas y utilice LEFT JOIN.

Si un vendedor no tiene ningún producto que cueste más que su salario, se mantendrá en el resultado final mediante LEFT JOIN. Su recuento en expensive_products tendrá un valor de 0.

Si desea obtener más información sobre cuándo utilizar JOINs no equitativos, consulte estos ejemplos detallados de JOINs no equitativos.

4. Precio del Producto por Categoría

Tarea: Para cada producto, encuentre cómo se compara su precio con el precio medio de otros productos de la categoría. Muestre el nombre y el precio del producto, junto con el precio medio de todos los demás productos de la misma categoría.

Respuesta:

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;

Explicación:

Para calcular el precio medio de todos los demás productos de la misma categoría, hay que crear pares como éste: producto - otro producto de la misma categoría. Para ello, auto-unir la tabla de productos en la categoría del producto. Esto incluirá filas en las que el producto está unido consigo mismo, por lo que es necesario añadir una condición adicional en JOIN: product1.name != product2.name. (Esto también podría ir en la cláusula WHERE).

Una vez completados todos los pares de productos, podemos calcular la media del precio del segundo producto del par y agrupar por el primer producto. Así obtendremos el resultado deseado.

5. Salario medio de un vendedor

Tarea: Mostrar todos los datos de los representantes de ventas, así como una columna con el salario medio de todos los representantes y la diferencia entre el salary de este vendedor y el average_salary de todos los representantes.

Respuesta:

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

Explicación:

Para obtener el salario medio de todos los vendedores, utilizaremos la función de ventana AVG(). Funciona de la misma manera que la función agregada AVG(), pero para que sea una función de ventana utilizamos OVER() en lugar de GROUP BY.

Utilice una cláusula vacía OVER() para obtener el valor medio del salario de todos los vendedores. Nombra la columna average_salary para mayor claridad. Resta el salario de cada representante de ventas (que es diferente para cada fila) de average_salary (que es el mismo para cada fila) para obtener la diferencia salarial de cada representante. Nómbralo salary_difference.

Si quieres practicar más funciones de ventana, consulta nuestro curso Funciones de ventana . Ofrece más de 200 ejercicios interactivos para que puedas conocer las funciones de ventana en detalle.

6. Precios relativos de productos

Tarea: Para cada producto, muestre la relación entre su precio y el precio del producto más caro de esa categoría.

Respuesta:

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

Explicación:

Para calcular la relación entre el precio del producto actual y el precio del producto más caro de la misma categoría, debemos utilizar esta fórmula: ratio = price / (max price from the same category).

Aquí no podemos utilizar GROUP BY, ya que colapsa las filas individuales; en su lugar, utilizamos la función de ventana MAX(). A diferencia del ejercicio anterior, aquí especificaremos explícitamente la partición. Queremos obtener un resultado distinto para cada categoría, por lo que la sintaxis que utilizaremos será: PARTITION BY category. Colóquela en la cláusula OVER(), que viene justo después de la función de ventana MAX().

7. Rangos de precios de productos dentro de las categorías

Tarea: Muestre cómo se clasifica el precio de cada producto dentro de su categoría. Muestre el nombre, precio y categoría de cada producto junto con el rango de precios. El producto más caro de su categoría debe ocupar el primer lugar y el más barato el último.

Respuesta:

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

Explicación:

Para crear un ranking para cada fila dentro de su categoría, necesitamos utilizar funciones de ventana de ranking. Existen varias opciones: RANK() DENSE_RANK() , o ROW_NUMBER(). Aunque pueden dar resultados diferentes en algunos casos, en este caso cualquiera de ellas funcionará. Puede encontrar más información sobre las diferencias entre estas tres funciones en nuestro resumen de funciones de clasificación SQL.

Para este ejemplo, utilizaremos ROW_NUMBER(). Devolverá el número de cada fila dentro de su categoría, sin omitir ni repetir números cuando los productos compartan el mismo rango.

Utilizamos ROW_NUMBER() junto con OVER() para especificar el tamaño de la ventana y el orden en el que se clasifican las filas. PARTITION BY category establece la ventana en todos los productos de la misma categoría que la fila actual. Esto garantiza que sólo se tengan en cuenta los productos de la misma categoría para calcular la clasificación. A continuación, ORDER BY price DESC establece el orden de clasificación (los productos con precios más altos se clasificarán más arriba).

8. Representantes mejor pagados de los gerentes

Tarea: Entre los representantes de ventas que dependen de un gerente, mostrar los que cobran más. En otras palabras: para cada gerente con subordinados, muestre a su subordinado mejor pagado pero no al gerente mismo.

Respuesta:

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;

Explicación:

En primer lugar, crearemos un resultado intermedio: para cada vendedor, encontraremos su ID, nombre, salario, ID de gerente y el salario más alto entre sus colegas (es decir, los representantes que comparten el mismo gerente). Utilizamos la función de ventana MAX() junto con OVER (PARTITION BY manager_id) para encontrar el salario más alto por grupo de representantes con el mismo manager_id.

Observe que envolvemos la consulta en una expresión común de tabla (CTE). Una CTE comienza con la palabra clave WITH y un nombre. Da este nombre a los resultados intermedios, a los que se puede hacer referencia posteriormente en la consulta principal.

En este caso, la CTE se denomina salesperson_with_highest_salary. Si necesita que le recordemos cómo funcionan las CTEs, consulte nuestra guía de expresiones de tabla comunes en SQL. Para un enfoque más profundo, pruebe nuestro curso Expresiones Comunes de Tabla.

Sólo necesitamos mostrar los representantes de ventas mejor pagados de su grupo. Ahora que tiene la dirección salary del representante junto con la dirección highest_salary del grupo, puede filtrar los vendedores en la consulta externa para mostrar sólo aquellos que tengan el mismo salario que el salario más alto del grupo. Si dos o más representantes de un grupo tienen el salario más alto, todos ellos se mostrarán en el resultado final.

9. Productos más caros por categoría

Tarea: En cada categoría, encuentre los tres productos más caros. Si varios productos tienen el mismo precio, inclúyalos todos.

Respuesta:

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;

Explicación:

Volvemos a utilizar una función ventana dentro de un CTE. Esta vez, necesitamos crear una clasificación adicional para cada fila dentro de su categoría. Necesitamos utilizar DENSE_RANK() para esto; devolverá todos los productos con los tres precios más altos, incluso si algunos productos tienen el mismo precio.

Utilice PARTITION BY category para obtener una clasificación separada dentro de cada categoría y ORDER BY price DESC para asegurarse de que los productos de mayor precio obtienen las clasificaciones más altas. Envuelva la consulta que encuentra la clasificación para cada fila en un CTE para que la clasificación esté disponible al filtrar las filas. Cualquier fila con el rango de 1, 2 o 3 está dentro de los tres primeros productos de su categoría; utilice esto como condición de filtrado en la consulta externa para obtener el resultado final.

¿Listo para tu entrevista de Amazon SQL?

¡Bien hecho! Si has resuelto con éxito todas las tareas de nuestra preparación para la entrevista de Amazon SQL, puedes estar seguro de tus conocimientos avanzados de SQL. ¡Buena suerte en tu próxima entrevista!

¿Quieres practicar preguntas de SQL más complejas? Echa un vistazo a estas 15 preguntas difíciles que combinan temas teóricos y prácticos de SQL. Y si buscas un abanico más amplio de ejercicios de práctica, en nuestra página SQL avanzado encontrarás más de 350 ejercicios. ¡Feliz práctica!