Colección completa de problemas de simulación de entrevista
Problemas integrales cronometrados que combinan JOIN, funciones de ventana y CTE en condiciones de entrevista.
Colección completa de problemas de simulación de entrevista es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.
Cómo se desarrolla una ronda de entrevista de SQL
Este capítulo final le presenta problemas simulados completos que combinan uniones, funciones de ventana y CTE en condiciones de entrevista. Primero, la habilidad fundamental: cómo comportarse durante la entrevista.
- Reformule el problema y confirme el esquema.
- Aclare los casos límite (valores NULL, empates y duplicados) antes de programar.
- Explique su enfoque y, después, escriba la consulta.
- Pruebe mentalmente la consulta con un ejemplo pequeño.
Los entrevistadores evalúan tanto su proceso como la consulta final.
El esquema compartido
Todos los problemas siguientes utilizan este pequeño esquema de comercio electrónico. Léalo una vez para que cada consulta tenga 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)
Téngalo presente; el resto de la lección hace referencia a estas tablas.
-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currencyProblema 1: clientes principales por gasto
«Devuelva los 3 clientes con mayor gasto total pagado, junto con su nombre y el total».
Enfoque: filtre los pedidos pagados, agregue por cliente, ordene y limite los resultados. Indique que excluye los pedidos cancelados y pendientes, un caso límite que los entrevistadores suelen introducir deliberadamente.
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 hicieron un pedido
«Enumere los clientes que nunca han realizado un pedido». Este es el patrón de antiunión. Hay dos soluciones sencillas: LEFT JOIN con IS NULL o NOT EXISTS.
Prefiera NOT EXISTS porque es seguro frente a NULL (a diferencia de NOT IN). Mencione esta diferencia; es exactamente lo que el entrevistador intenta descubrir.
-- 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 importe de pedido más alto
«Encuentre el segundo importe de pedido distinto más alto». La solución más clara y resistente a empates utiliza DENSE_RANK, de modo que los importes duplicados compartan el mismo rango.
Debe mencionar este caso límite: si no existe un segundo valor distinto, no se devolverán filas. Esto puede ser aceptable o puede requerir un envoltorio con COALESCE, según los requisitos.
SELECT amount
FROM (
SELECT amount,
DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
FROM orders
) ranked
WHERE rnk = 2;Problema 4: último pedido por cliente
«Devuelva el pedido más reciente de cada cliente». Este es el patrón para conservar la última fila de cada clave, resuelto con ROW_NUMBER particionado por cliente y ordenado por fecha descendente.
Añada un criterio de desempate (el id del pedido) para que el resultado sea determinista cuando dos pedidos compartan una fecha; es un detalle que suelen incluir los candidatos destacados.
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: crecimiento intermensual
«Calcule los ingresos mensuales pagados y su variación porcentual con respecto al mes anterior». Esto combina la agregación en una CTE con LAG.
En el primer paso, agregue por mes; en el segundo, compare cada mes con el anterior mediante LAG. Controle la división para que el primer mes (que no tiene un mes anterior) no produzca un error.
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: producto principal por categoría
«Para cada categoría, devuelva el producto más vendido según la cantidad total». Es el patrón de los N principales por grupo: agregue, asigne rangos dentro de la partición y filtre por el rango 1.
Si los empates son importantes, sustituya ROW_NUMBER por RANK para que aparezcan todos los líderes empatados. Explicar esta elección demuestra que entiende la diferencia.
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 de ingresos
«Muestre el total acumulado de ingresos pagados por día». Una SUM de ventana con un marco ordenado produce el total acumulado sin una auto-unión.
Mencione el uso del marco ROWS para obtener una acumulación fila por fila real; el marco RANGE predeterminado puede comportarse de forma inesperada cuando hay fechas repetidas.
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: días activos consecutivos
«Encuentre los usuarios que tengan al menos 3 días consecutivos con un pedido pagado». Es una variante del patrón de huecos y agrupaciones que utiliza el truco de la diferencia de números de fila.
Al restar de la fecha el número de fila por usuario se obtiene una constante dentro de una secuencia consecutiva; después, se agrupa por esa constante y se cuentan las filas. Esto demuestra un nivel 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;Rendimiento y errores frecuentes
Después de escribir una consulta correcta, los entrevistadores preguntan «¿cómo la haría más rápida?» y buscan errores clásicos. Tenga preparada esta lista de comprobación:
- Indexe las columnas de unión y filtrado (por ejemplo,
orders(customer_id, status)); evite aplicar funciones a columnas indexadas en WHERE. - Prefiera EXISTS a IN para antiuniones grandes;
NOT INcon un NULL no devuelve ninguna fila silenciosamente. - Filtrar en WHERE una columna de una unión externa la convierte silenciosamente en una unión interna.
- Añada siempre un criterio de desempate para que los resultados de los N principales sean deterministas.
- Compruebe el plan EXPLAIN para detectar exploraciones secuenciales en tablas grandes.
Comprobación rápida
Necesita obtener el único pedido más reciente de cada cliente, y dos pedidos pueden compartir la misma fecha.
Repaso: conjunto completo de entrevistas simuladas
Ha resuelto de principio a fin los problemas de entrevista más frecuentes:
- Agregación + LIMIT para obtener los N principales por gasto.
- Antiuniones con NOT EXISTS (seguras frente a NULL).
- DENSE_RANK para el enésimo valor más alto y ROW_NUMBER para obtener el último por clave y el principal por grupo.
- LAG para las comparaciones intermensuales y SUM OVER para los totales acumulados.
- El truco de números de fila de huecos y agrupaciones para las rachas.
- Cierre cada respuesta comentando los índices, EXPLAIN y los errores frecuentes.
Preguntas frecuentes
¿La lección «Colección completa de problemas de simulación de entrevista» es gratis?
Sí — el texto completo de «Colección completa de problemas de simulación de entrevista» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Colección completa de problemas de simulación de entrevista»?
Problemas integrales cronometrados que combinan JOIN, funciones de ventana y CTE en condiciones de entrevista. Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Coding Interview Prep?
No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Colección completa de problemas de simulación de entrevista»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?
Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Normalización hasta la 3NF
- Modelado ER y cardinalidad de relaciones
- Esquema de estrella y diseño de almacenes de datos
- Colección completa de problemas de simulación de entrevista