Hoja de referencia
Hoja de referencia de SQL
Una página para repasar el SQL que te van a preguntar, para imprimir.
Preparación para entrevistas · 64 preguntas
Preguntas que salen en entrevistas reales para analistas. Responde cada una en voz alta primero y luego ábrela: la respuesta modelo, la respuesta que resta puntos y un nivel donde practicarla con datos reales.
Junior: filtros iniciales y primeros empleos. Analista: el núcleo de la mayoría de los procesos. Senior: ejercicios para casa y preguntas de seguimiento que ponen a prueba tu criterio.
Aparece en casi todos los procesos para analistas, a menudo en vivo en un editor compartido. Lo más común: JOIN, agrupaciones, NULL y funciones de ventana.
Respuesta modelo. WHERE filtra las filas antes de agruparlas; HAVING filtra los grupos después de calcular las agregaciones. Por eso una condición sobre una columna normal (status = 'completed') va en WHERE, y una condición sobre una agregación (COUNT(*) >= 20) va en HAVING. Filtrar pronto con WHERE además es más barato, porque llegan menos filas al GROUP BY.
Respuesta incorrecta común. "Hacen lo mismo, HAVING solo se usa con GROUP BY." Una condición HAVING sobre una columna agrupada sí funciona, pero una agregación en WHERE da error, y el entrevistador quiere oír por qué.
Practica: SQL · Nuestros clientes más lealesPractica: SQL · ¿Por qué falla esta consulta? Hoja de referencia de SQL: Agrupar y contar
Respuesta modelo. COUNT(*) cuenta filas. COUNT(columna) cuenta las filas donde esa columna no es NULL. COUNT(DISTINCT columna) cuenta los valores distintos que no son NULL. En la tabla customers, COUNT(*) y COUNT(referral_source) difieren en el número de clientes sin fuente de referencia.
SELECT COUNT(*) AS customers,
COUNT(referral_source) AS with_source,
COUNT(DISTINCT referral_source) AS sources
FROM customers; Respuesta incorrecta común. "Son lo mismo salvo que haya duplicados." El comportamiento con NULL es justo lo que busca la pregunta.
Respuesta modelo. Un INNER JOIN conserva solo las filas que coinciden en ambos lados. Un LEFT JOIN conserva todas las filas de la tabla izquierda; donde no hay coincidencia, las columnas de la tabla derecha salen como NULL. Usa un LEFT JOIN cuando el lado izquierdo debe quedar completo, por ejemplo todos los clientes, incluidos los que nunca pidieron.
Respuesta incorrecta común. Dibujar un diagrama de Venn y quedarse ahí. Oculta que una fila de la izquierda puede coincidir con muchas de la derecha y aparecer varias veces.
Practica: SQL · Ingresos por categoríaPractica: SQL · Clientes que nunca pidieron Hoja de referencia de SQL: Unir dos tablas con JOIN
Respuesta modelo. Lógicamente la consulta ejecuta FROM y JOIN, luego WHERE, GROUP BY, HAVING, SELECT, ORDER BY y LIMIT. WHERE se ejecuta antes que SELECT, así que el alias todavía no existe. ORDER BY se ejecuta después de SELECT, y por eso allí el alias sí funciona.
Respuesta incorrecta común. "Los alias solo funcionan en ORDER BY por una regla de sintaxis." La razón real es el orden de ejecución.
Respuesta modelo. Ambos apilan las filas de dos consultas con el mismo número y tipo de columnas. UNION elimina las filas duplicadas del resultado combinado, lo que cuesta una ordenación o un hash; UNION ALL conserva todas las filas. Usa UNION ALL salvo que necesites quitar duplicados, y explica por qué cuando lo hagas.
SELECT channel AS source FROM marketing_spend
UNION
SELECT source FROM web_sessions
ORDER BY source; Respuesta incorrecta común. "UNION une dos tablas lado a lado." Eso es un JOIN; UNION apila filas.
Respuesta modelo. DDL (definición de datos) cambia la estructura: CREATE, ALTER, DROP. DML (manipulación de datos) cambia filas: INSERT, UPDATE, DELETE. DELETE elimina las filas que elige un WHERE y se puede deshacer dentro de una transacción; TRUNCATE vacía toda la tabla rápidamente y conserva su estructura; DROP elimina la tabla misma, estructura incluida.
Respuesta incorrecta común. "DELETE sin WHERE es lo mismo que DROP." Después de un DELETE la tabla sigue ahí, solo que vacía.
Respuesta modelo. Haz un LEFT JOIN de customers con orders y conserva las filas donde el lado de los pedidos es NULL (un anti-join), o usa NOT EXISTS. Comprueba el NULL sobre la clave del JOIN o la clave primaria de la tabla derecha, que solo puede ser NULL cuando no hubo coincidencia.
SELECT c.customer_id, c.email
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.customer_id
WHERE o.order_id IS NULL; Respuesta incorrecta común. WHERE customer_id NOT IN (SELECT customer_id FROM orders). Aquí funciona, pero no devuelve nada en cuanto la subconsulta contiene un solo NULL.
Practica: SQL · Clientes que nunca pidieronPractica: Python · Clientes que nunca han comprado
Respuesta modelo. Hay una condición sobre la tabla derecha en la cláusula WHERE. En las filas sin coincidencia esas columnas son NULL, la condición no es verdadera y las filas se descartan, así que el LEFT JOIN se comporta como un INNER JOIN. Mueve la condición a la cláusula ON para filtrar lo que se une sin perder ninguna fila de la izquierda.
SELECT c.customer_id, COUNT(o.order_id) AS app_orders
FROM customers AS c
LEFT JOIN orders AS o
ON o.customer_id = c.customer_id AND o.channel = 'app'
GROUP BY c.customer_id; Respuesta incorrecta común. "Usa un RIGHT JOIN" o "añade DISTINCT". Ninguno toca la causa.
Respuesta modelo. Ordena los precios con DENSE_RANK en orden descendente y conserva el puesto 2. DENSE_RANK maneja los empates: si dos productos comparten el precio máximo, el siguiente precio sigue siendo el puesto 2. Di cómo tratas los empates antes de escribir la consulta.
WITH ranked AS (
SELECT name, unit_price,
DENSE_RANK() OVER (ORDER BY unit_price DESC) AS rnk
FROM products
)
SELECT name, unit_price
FROM ranked
WHERE rnk = 2; Respuesta incorrecta común. ORDER BY unit_price DESC LIMIT 1 OFFSET 1. Con un empate en lo más alto, vuelve a devolver el precio máximo.
Practica: SQL · ROW_NUMBER vs RANK vs DENSE_RANKPractica: SQL · Página dos de la lista de precios
Respuesta modelo. Los tres numeran las filas según el orden de la ventana. ROW_NUMBER da a cada fila un número único y desempata de forma arbitraria a menos que añadas un criterio de desempate. RANK da el mismo número a las filas empatadas y luego salta (1, 2, 2, 4). DENSE_RANK da el mismo número a los empates sin huecos (1, 2, 2, 3).
Respuesta incorrecta común. "Son lo mismo, con nombres distintos." O usar ROW_NUMBER para "los 3 precios más altos" cuando los empates deberían compartir puesto.
Practica: SQL · ROW_NUMBER vs RANK vs DENSE_RANK Hoja de referencia de SQL: Funciones de ventana
Respuesta modelo. Decide qué hace que dos registros sean la misma persona, limpia esa clave (LOWER y TRIM sobre el correo), agrupa con GROUP BY por la clave y conserva los grupos con COUNT(*) > 1. Devuelve los ids de cada grupo para que alguien decida qué registro conservar.
SELECT LOWER(TRIM(email)) AS email_key,
COUNT(*) AS records,
MIN(customer_id) AS first_id
FROM customers
GROUP BY 1
HAVING COUNT(*) > 1; Respuesta incorrecta común. SELECT DISTINCT *. Los duplicados en datos reales difieren en un id, una marca de tiempo o las mayúsculas, así que DISTINCT no elimina nada.
Practica: SQL · Encuentra registros de clientes duplicadosPractica: Python · Encuentra clientes duplicados
Respuesta modelo. Una CTE (WITH nombre AS (...)) da nombre a un resultado intermedio que puedes consultar como una tabla. Se lee de arriba abajo, cada paso se puede revisar por separado y se puede referenciar más de una vez en la consulta. En la mayoría de los motores rinde igual que la subconsulta equivalente; la ganancia es legibilidad y menos errores.
Respuesta incorrecta común. "Las CTE son más rápidas." A veces, y muchas veces no; afirmarlo sin conocer el motor es una señal de alerta.
Practica: SQL · Valor de vida del clientePractica: SQL · Ingresos por envío y por mercancía de cada canal Hoja de referencia de SQL: Subconsultas y CTE
Respuesta modelo. SUM(valor) OVER (ORDER BY fecha). Con ORDER BY en la ventana y sin marco, el marco por defecto va desde la primera fila hasta la actual, incluyendo las filas empatadas. Añade PARTITION BY para reiniciar el total por grupo, por ejemplo por año.
Respuesta incorrecta común. Una subconsulta correlacionada que vuelve a sumar todas las filas anteriores para cada fila. Funciona, pero es lenta y difícil de leer.
Respuesta modelo. Los sistemas OLTP hacen funcionar el negocio: muchas lecturas y escrituras pequeñas (un pedido que se registra), tablas normalizadas, datos actuales. Los sistemas OLAP sirven al análisis: grandes lecturas y agregaciones sobre el historial, a menudo un esquema en estrella en un almacén de datos alimentado desde los sistemas OLTP. Los analistas suelen consultar el lado OLAP para que los reportes no frenen la tienda.
Respuesta incorrecta común. Describirlas como dos proveedores o dos lenguajes de consulta.
Respuesta modelo. Numera las filas dentro de cada categoría con ROW_NUMBER() OVER (PARTITION BY category ORDER BY unit_price DESC) y luego filtra por ese número en una consulta exterior. Las funciones de ventana se calculan después de WHERE, así que el filtro tiene que ir un nivel más arriba, en una CTE o una subconsulta.
WITH ranked AS (
SELECT category, name, unit_price,
ROW_NUMBER() OVER (PARTITION BY category
ORDER BY unit_price DESC, product_id) AS rn
FROM products
)
SELECT category, name, unit_price
FROM ranked
WHERE rn <= 3
ORDER BY category, rn; Respuesta incorrecta común. GROUP BY category con ORDER BY y LIMIT 3, que devuelve tres filas en total, no tres por categoría.
Respuesta modelo. El costo de envío se guarda una vez por pedido, pero el JOIN devuelve una fila por línea de pedido, así que cada costo se repite por cada línea (una multiplicación de filas o fan-out). Suma las columnas a nivel de pedido en la granularidad del pedido: agrega primero las líneas a una fila por pedido y después une, o suma el costo de envío antes de unir.
WITH merch AS (
SELECT order_id, SUM(quantity * unit_price) AS merch
FROM order_items
GROUP BY order_id
)
SELECT o.channel,
SUM(o.shipping_fee) AS shipping,
ROUND(SUM(m.merch), 2) AS merchandise
FROM orders AS o
JOIN merch AS m ON m.order_id = o.order_id
GROUP BY o.channel; Respuesta incorrecta común. SUM(DISTINCT shipping_fee). También descarta pedidos distintos que casualmente tienen el mismo costo, como todos los de 6.95.
Practica: SQL · Líneas por pedido sin contar doblePractica: SQL · Ingresos por envío y por mercancía de cada canal
Respuesta modelo. Si la subconsulta devuelve un NULL, x NOT IN (1, 2, NULL) significa x <> 1 AND x <> 2 AND x <> NULL. La última comparación es desconocida, así que toda la condición nunca es verdadera. Usa NOT EXISTS o filtra los NULL fuera de la subconsulta.
SELECT e.employee_id, e.first_name
FROM employees AS e
WHERE NOT EXISTS (
SELECT 1 FROM employees AS r WHERE r.manager_id = e.employee_id
); Respuesta incorrecta común. "Es un error de la base de datos." Es la lógica estándar de tres valores.
Practica: SQL · Clientes que devolvieron algoPractica: SQL · La trampa de comparar con NULL
Respuesta modelo. Primero agrega a una fila por mes, luego usa LAG para traer el mes anterior a la misma fila y calcula (este − anterior) / anterior. Multiplica por 100.0, no por 100: en SQL Server y PostgreSQL un entero dividido entre un entero es una división entera y redondea el crecimiento a cero.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS month, COUNT(*) AS orders
FROM orders
GROUP BY 1
)
SELECT month, orders,
ROUND(100.0 * (orders - LAG(orders) OVER (ORDER BY month))
/ LAG(orders) OVER (ORDER BY month), 1) AS mom_pct
FROM monthly
ORDER BY month; Respuesta incorrecta común. Un self-join con mes = mes − 1 escrito sobre fechas sin procesar, que falla al cambiar de año y en los finales de mes.
Practica: SQL · Crecimiento mes a mesPractica: SQL · Ingresos mensuales de 2025
Para puestos que usan Python: seleccionar, agrupar y combinar, y las trampas que cambian el número de filas.
Respuesta modelo. loc selecciona por etiqueta: etiquetas del índice y nombres de columnas, y acepta máscaras booleanas. iloc selecciona por posición entera. Los cortes (slices) también difieren: loc incluye la etiqueta final, iloc excluye la posición final, como un slice de Python.
Respuesta incorrecta común. "loc es para filas e iloc para columnas." Ambos reciben filas y columnas.
Respuesta modelo. Corchetes simples con un nombre devuelven una Series (una columna, con el índice). Una lista de nombres devuelve un DataFrame, incluso cuando la lista tiene un solo nombre. Importa porque los métodos y los merges se comportan distinto en cada uno.
Respuesta incorrecta común. "Ambos devuelven la columna." Devuelven tipos distintos.
Practica: Python · ¿Series o DataFrame?Practica: Python · Elige las columnas que necesitas
Respuesta modelo. El and de Python pide un único True/False a cada lado, y una Series con muchos booleanos no tiene un único valor de verdad. Usa los operadores elemento a elemento & | ~ y pon cada comparación entre paréntesis, porque & se evalúa antes que >.
products[(products["category"] == "Decor") & (products["unit_price"] < 50)] Respuesta incorrecta común. "Usa and con paréntesis." Los paréntesis solos no lo arreglan; el operador tiene que ser &.
Respuesta modelo. Un gráfico de líneas para el cambio en el tiempo; un gráfico de barras horizontales ordenado para comparar categorías; un histograma o un diagrama de caja para una distribución; un diagrama de dispersión (con línea de tendencia si ayuda) para dos variables numéricas. En Python: plt.plot, sns.barplot o df.plot.barh, sns.histplot o sns.boxplot, sns.scatterplot o sns.regplot.
monthly = orders.groupby(orders["order_date"].dt.to_period("M")).size()
monthly.tail(12) Respuesta incorrecta común. Un gráfico circular con muchas porciones, o un gráfico de líneas entre categorías que no tienen orden.
Respuesta modelo. size() cuenta las filas de cada grupo, valores faltantes incluidos, y devuelve una sola Series. count() cuenta los valores no faltantes por columna, así que puede variar de una columna a otra. Equivale a COUNT(*) frente a COUNT(columna) en SQL.
g = customers.groupby("segment")
pd.DataFrame({"rows": g.size(), "with_source": g["referral_source"].count()}) Respuesta incorrecta común. "size es el número de columnas." Eso es .shape[1] en un DataFrame.
Respuesta modelo. merge une dos DataFrames por columnas clave, como un JOIN de SQL (how="left", "inner" …). join es un atajo para unir por el índice. concat apila los DataFrames uno encima del otro (filas) o lado a lado (columnas) sin emparejar claves.
Respuesta incorrecta común. Usar concat con axis=1 para combinar dos tablas, que empareja las filas por posición o etiqueta del índice y las desalinea sin avisar.
Practica: Python · Añade nombres de producto a las líneas de pedidoPractica: Python · Ingresos por categoría, solo pedidos completados Hoja de referencia de pandas: Unir dos tablas (merge)
Respuesta modelo. Primero mídelos (isna().sum()) y averigua por qué faltan. Luego decide columna por columna: elimina las filas cuando son pocas y aleatorias, rellena con una etiqueta en las categorías ("unknown"), déjalos como NaN cuando un promedio debe omitirlos, y di qué hiciste en el informe. Rellenar con 0 cambia las medias y los totales.
customers.isna().sum() Respuesta incorrecta común. "df.dropna()" sobre todo el DataFrame. Elimina cada fila con cualquier valor faltante, a menudo la mayoría de los datos.
Practica: Python · ¿De dónde vienen los clientes?Practica: Python · ¿Qué hace mean() con los costes ausentes?
Respuesta modelo. duplicated(subset=...) marca las repeticiones de una clave y drop_duplicates(subset=..., keep="first") las elimina. Limpia primero la clave (strip, lower) para detectar los casi duplicados, y mira las filas marcadas antes de borrar nada.
key = customers["email"].str.strip().str.lower()
customers[key.duplicated(keep=False)] Respuesta incorrecta común. df.drop_duplicates() sin subset, que solo elimina las filas idénticas en todas las columnas, así que los casi duplicados se quedan.
Respuesta modelo. apply llama a la función de Python una vez por fila. Las operaciones vectorizadas trabajan sobre toda la columna en código compilado: aritmética entre columnas, np.where para if/else, pd.cut para tramos, métodos .str y .dt. Recurre a apply solo cuando no exista una forma vectorizada.
np.where(products["unit_price"] >= 200, "premium", "standard") Respuesta incorrecta común. "Usa un bucle for con iterrows." Eso es todavía más lento.
Practica: Python · Calcula el ingreso por líneaPractica: Python · Etiqueta los pedidos por tamaño
Respuesta modelo. Asignaste algo que puede ser una vista de otro DataFrame, así que pandas no puede garantizar que el original cambie ni que no cambie. Selecciona y asigna en un solo paso con .loc[filas, columna] = valor, o haz un .copy() explícito cuando quieras trabajar sobre un DataFrame separado.
Respuesta incorrecta común. "Ignóralo, es solo una advertencia." A veces la asignación no se hizo.
Respuesta modelo. La tabla derecha tiene claves repetidas, así que cada fila de la izquierda coincide con varias de la derecha. Comprueba que la clave sea única en el lado donde lo esperas (right["key"].is_unique) y pasa validate="many_to_one" para que el merge lance un error en lugar de multiplicar filas en silencio.
lines = order_items.merge(products[["product_id", "category"]],
on="product_id", how="left", validate="many_to_one")
len(lines) == len(order_items) Respuesta incorrecta común. "Llama a drop_duplicates() después del merge." Esconde el síntoma y puede borrar filas reales.
Practica: Python · ¿Por qué se duplicaron los ingresos de envío?Practica: Python · Gastos de envío en pedidos de iluminación
Sigue siendo la herramienta más usada en los equipos de negocio. Espera referencias, búsquedas, totales condicionales y tablas dinámicas.
Respuesta modelo. A1 es relativa: tanto la columna como la fila cambian al copiar la fórmula. $A$1 es absoluta y nunca se mueve. A$1 fija solo la fila y $A1 solo la columna. Las referencias mixtas permiten que una sola fórmula rellene toda una tabla, por ejemplo una tasa en la parte superior y artículos en el lateral.
Respuesta incorrecta común. "El $ es para la moneda." O fijarlo todo con $ para que la fórmula no se pueda arrastrar.
Practica: Excel · Precios con impuesto, una sola tasa para todas las filasPractica: Excel · Totales de línea con referencias de celda Hoja de referencia de Excel: Fórmulas, referencias y arrastre hacia abajo
Respuesta modelo. XLOOKUP cuando está disponible: coincidencia exacta por defecto, mira a la izquierda o a la derecha y tiene un argumento para "no encontrado". INDEX/MATCH funciona en todas las versiones y no se rompe al insertar columnas. VLOOKUP solo mira hacia la derecha, usa un número de columna fijo y por defecto hace coincidencia aproximada.
Respuesta incorrecta común. "VLOOKUP, es el estándar." Sin decir FALSE para la coincidencia exacta.
Practica: Excel · Precios de lista con VLOOKUP e IFERRORPractica: Excel · Nombres de producto con XLOOKUP Hoja de referencia de Excel: Unir dos tablas: búsquedas
Respuesta modelo. IFS(prueba1, valor1, prueba2, valor2, …, TRUE, alternativa) o IF anidados. Ordena las pruebas para que la primera verdadera sea la correcta (en los tramos, del límite más bajo hacia arriba) y termina con un comodín. Para varias condiciones a la vez, pon AND() u OR() dentro del IF.
Respuesta incorrecta común. Varias columnas IF separadas que se suman, lo que cuenta doble cuando dos pruebas son verdaderas.
Practica: Excel · Costos de envío con IFPractica: Excel · Tres tramos de envío con IFS
Respuesta modelo. SUMIF recibe una condición y el rango que se suma va al final: SUMIF(rango, criterio, rango_suma). SUMIFS recibe una o más condiciones y el rango que se suma va primero: SUMIFS(rango_suma, rango1, criterio1, …). Muchos analistas usan SUMIFS siempre para que el orden nunca cambie.
Respuesta incorrecta común. Confundir el orden de los argumentos entre las dos, lo que suma la columna equivocada sin ningún error.
Practica: Excel · Pedidos de la app con COUNTIF y SUMIFPractica: Excel · Varias condiciones con SUMIFS y COUNTIFS Hoja de referencia de Excel: Agrupar y contar: COUNTIFS, SUMIFS
Respuesta modelo. Datos › Validación de datos: permite solo una lista (un desplegable de canales), números enteros dentro de un rango, fechas dentro de un periodo o una longitud máxima de texto, con un mensaje de entrada y una alerta de error personalizada. Guarda la lista permitida en su propio rango o en una tabla de Excel para que pueda crecer, y protege la hoja si hace falta.
Respuesta incorrecta común. "Añade una nota pidiendo que tengan cuidado." Prevenir es mejor que limpiar después.
Respuesta modelo. Falta el cuarto argumento o es TRUE, así que VLOOKUP hace una coincidencia aproximada: con datos sin ordenar devuelve la fila en la que caiga. Pasa FALSE (o 0) para una coincidencia exacta. Otras causas: claves guardadas como texto en un lado y como números en el otro, o espacios al final.
Respuesta incorrecta común. "Excel tiene un error, vuelve a escribir la fórmula."
Practica: Excel · Precios de lista con VLOOKUP e IFERRORPractica: Excel · Nombres de producto con XLOOKUP
Respuesta modelo. Para explorar y resumir: totales por categoría y mes, filtros rápidos, desglose de las filas detrás de un número. Las fórmulas (SUMIFS) son mejores cuando el resumen debe ir en un diseño de informe fijo, alimentar otros cálculos o actualizarse sin refrescar.
Respuesta incorrecta común. "Las tablas dinámicas son para quien no sabe escribir fórmulas." Las dos tienen su lugar; explica cuándo encaja cada una.
Respuesta modelo. Números guardados como texto: quedan alineados a la izquierda, a menudo con un triángulo verde, y SUM los omite. Compruébalo con ISNUMBER y conviértelos con VALUE, con Texto en columnas o multiplicando por 1. Busca también espacios sueltos y espacios de no separación que vienen de las exportaciones.
Respuesta incorrecta común. "Vuelve a escribir los números a mano." No escala y esconde la causa.
Respuesta modelo. Añade una columna auxiliar con =COUNTIF($J$2:$J$41,J2)>1 para marcar todas las copias, o =COUNTIF($J$2:J2,J2)=1 para marcar la primera aparición. El formato condicional los muestra visualmente; Datos › Quitar duplicados los elimina, así que guarda antes una copia. Limpia la clave con TRIM y LOWER antes de comparar.
Respuesta incorrecta común. Ordenar y revisar a ojo, lo que pasa por alto los casi duplicados con distintas mayúsculas o espacios.
Hoja de referencia de Excel: Valores faltantes, errores y duplicados
Respuesta modelo. Una tabla crece con las filas nuevas, arrastra fórmulas y formatos automáticamente, mantiene visibles los encabezados y permite que las fórmulas usen nombres de columna (referencias estructuradas como Orders[Quantity]) en lugar de rangos A1 que se quedan desactualizados. Las tablas dinámicas, las segmentaciones y Power Query la leen como una sola fuente con nombre.
Respuesta incorrecta común. "Solo añade colores y filas alternas."
Para puestos que construyen paneles (dashboards): el modelo de datos, las medidas, CALCULATE y Power Query.
Respuesta modelo. Una columna calculada se calcula una vez por fila cuando se actualizan los datos y se guarda en el modelo, como una columna nueva de la tabla; úsala para segmentar o filtrar (un tramo de precio). Una medida se calcula al consultar, con los filtros que aplique el objeto visual (un total, una tasa); úsala para los números que agregas. La mayoría de los KPI deberían ser medidas.
Respuesta incorrecta común. "Son lo mismo, una medida es solo una columna con SUM." Las columnas calculadas usadas para totales inflan el modelo e ignoran los filtros del objeto visual.
Respuesta modelo. Combinar une dos consultas lado a lado por una clave, como un JOIN de SQL o un merge de pandas (externa izquierda, interna, anti …). Anexar apila consultas con las mismas columnas una encima de otra, como UNION ALL o pd.concat, por ejemplo archivos mensuales en una sola tabla.
Respuesta incorrecta común. Confundir las dos, o usar Combinar para unir doce archivos mensuales.
Practica: Python · Añade nombres de producto a las líneas de pedidoPractica: SQL · Ingresos por categoría
Respuesta modelo. CALCULATE evalúa una expresión en un contexto de filtro modificado: añade, reemplaza o quita filtros antes de calcular. Por ejemplo, CALCULATE([Revenue], Orders[Channel] = "web") da los ingresos web en cada celda de un objeto visual, y CALCULATE([Revenue], ALL(Products)) ignora los filtros de producto para dar un total que sirva para un porcentaje del total.
Respuesta incorrecta común. "Es como SUMIF." Cambia el contexto de filtro para cualquier expresión, y por eso la inteligencia de tiempo y el porcentaje del total se construyen sobre ella.
Respuesta modelo. Una tabla de hechos con eventos y números (líneas de pedido: cantidad, precio, claves) en el centro, unida de uno a muchos a las tablas de dimensiones que las describen (productos, clientes, fechas). Los filtros fluyen de las dimensiones a la tabla de hechos, las medidas se mantienen simples y el motor la comprime bien. Una sola tabla plana enorme o una telaraña de tablas hacen que DAX sea más difícil y más lento.
Respuesta incorrecta común. "Pon todo en una sola tabla para no necesitar relaciones."
Practica: SQL · Ingresos por categoríaPractica: SQL · Líneas por pedido sin contar doble
Respuesta modelo. Las funciones de inteligencia de tiempo como SAMEPERIODLASTYEAR, DATESYTD y TOTALYTD necesitan un calendario continuo con una fila por día, marcado como tabla de fechas y relacionado con la fecha de la tabla de hechos. Las fechas sin ventas también necesitan una fila; si no, la comparación con el año anterior tiene huecos.
Respuesta incorrecta común. "Usa directamente la columna de fecha del pedido." Se salta los días sin pedidos y rompe la inteligencia de tiempo.
Practica: Casos · Revisión de la temporada navideña en SQLPractica: SQL · Crecimiento mes a mes
Respuesta modelo. Seguridad a nivel de fila: define un rol con un filtro DAX sobre la dimensión de región (estático, o dinámico con USERPRINCIPALNAME() cruzado con una tabla de usuario a región), publica en el servicio de Power BI y asigna usuarios o grupos al rol. Pruébalo con "Ver como" antes de compartir.
Respuesta incorrecta común. "Haz una copia del informe por región." Multiplica el mantenimiento y sigue compartiendo el conjunto de datos completo.
Respuesta modelo. Import carga una copia comprimida en el modelo: los objetos visuales más rápidos y DAX completo, pero los datos solo están tan al día como la última actualización y el tamaño es limitado. DirectQuery envía consultas al origen cada vez: casi en tiempo real y sin límite de tamaño, pero con objetos visuales más lentos, más carga en el origen y algunas limitaciones de DAX. Usa Import por defecto; elige DirectQuery cuando lo exijan la frescura de los datos o el tamaño.
Respuesta incorrecta común. "DirectQuery siempre es mejor porque está en vivo."
Lo suficiente para leer un experimento y evitar las malas interpretaciones clásicas: promedios, valores p, intervalos, tipos de error.
Respuesta modelo. Cuando los datos son asimétricos o tienen valores atípicos: importes de pedidos, salarios, tiempo en el sitio. Unos pocos pedidos de negocio muy grandes suben la media, mientras que la mediana muestra el pedido típico. Reporta ambas cuando la diferencia entre ellas es en sí misma la historia.
lines = order_items.assign(rev=order_items["quantity"] * order_items["unit_price"])
order_value = lines.groupby("order_id")["rev"].sum()
order_value.agg(["mean", "median"]).round(2) Respuesta incorrecta común. "La mediana es más exacta." Ninguna es más exacta; responden preguntas distintas.
Practica: Casos · Plantea la pregunta de plantilla y salariosPractica: Casos · Verifica y resume plantilla y salarios en SQL
Respuesta modelo. No necesariamente. El correo llega a personas que ya conocen la tienda, así que la audiencia es distinta (selección). La correlación muestra que las dos cosas se mueven juntas; la causalidad necesita una comparación en la que la única diferencia sea el correo, idealmente una prueba aleatorizada con un grupo de control.
SELECT source,
ROUND(AVG(CASE WHEN converted THEN 1.0 ELSE 0 END) * 100, 2) AS conversion_pct
FROM web_sessions
GROUP BY source
ORDER BY conversion_pct DESC; Respuesta incorrecta común. "Sí, así que pasemos el presupuesto de pago al correo."
Practica: Casos · Costo por conversión en SQLPractica: Casos · Recomienda: ¿mantener, revertir o extender?
Respuesta modelo. Primero mira (diagrama de caja, histograma) y luego usa una regla como los valores a más de 1.5 × IQR de los cuartiles. Después investiga: un error de datos se corrige o se elimina, un valor real pero raro (un pedido de negocio de 100 unidades) se queda, y puedes reportar los resultados con y sin él. Nunca descartes valores atípicos en silencio.
q1, q3 = order_items["quantity"].quantile([0.25, 0.75])
iqr = q3 - q1
order_items[(order_items["quantity"] < q1 - 1.5 * iqr) | (order_items["quantity"] > q3 + 1.5 * iqr)] Respuesta incorrecta común. "Elimina todo lo que esté a más de 3 desviaciones estándar" como paso automático.
Practica: SQL · Desafío final: revisión de calidad de datosPractica: Python · Desafío final: el informe limpio de 2025
Respuesta modelo. Suponiendo que no hay un efecto real (la hipótesis nula), el valor p es la probabilidad de ver un resultado al menos tan extremo como el observado. Un valor p pequeño significa que los datos serían sorprendentes si no hubiera efecto. No es el tamaño del efecto ni la probabilidad de que el resultado sea real.
Respuesta incorrecta común. "La probabilidad de que la hipótesis nula sea verdadera", o "la probabilidad de que el resultado haya ocurrido por azar". Ambas son el error clásico.
Practica: Estadística · Lo que realmente dice p = 0.03Practica: Estadística · Prueba la prueba con una división A/A
Respuesta modelo. Si repitieras el muestreo muchas veces y construyeras un intervalo de la misma forma cada vez, alrededor del 95% de esos intervalos contendría el valor real. Expresa lo preciso que es la estimación: un intervalo ancho significa que sabes poco.
Respuesta incorrecta común. "Hay un 95% de probabilidad de que el valor real esté dentro de este intervalo." El valor real es fijo; lo que varía es el intervalo.
Practica: Estadística · Desafío final: ¿qué tan grande debe ser la muestra?Practica: Estadística · ¿Qué tan segura es la tasa móvil?
Respuesta modelo. Un error de tipo I es un falso positivo: concluyes que hay un efecto cuando no lo hay (su tasa es alfa, a menudo 5%). Un error de tipo II es un falso negativo: no detectas un efecto que sí existe (su tasa es beta; potencia = 1 − beta). Reducir uno normalmente aumenta el otro, a menos que recojas más datos.
Respuesta incorrecta común. Confundir los dos, o decir que una muestra más grande reduce solo los errores de tipo I.
Practica: Estadística · Desafío final: planifica la prueba del banner
Respuesta modelo. Elige una métrica principal (conversión del pago) y unas pocas métricas de control (importe del pedido, errores). Decide el efecto más pequeño que vale la pena detectar y calcula el tamaño de muestra y la duración antes de empezar. Aleatoriza por usuarios, no por sesiones, ejecuta semanas completas, no pares antes de tiempo cuando parezca ir bien y compara después con una prueba de significancia y un intervalo de confianza.
Respuesta incorrecta común. "Déjala correr hasta que el resultado sea significativo." Mirar los resultados antes de tiempo infla los falsos positivos.
Practica: Excel · Promedio de páginas por visita, solo móvilPractica: Estadística · Desafío final: ¿qué tan grande debe ser la muestra?
Respuesta modelo. La desviación estándar mide lo dispersos que están los valores individuales. El error estándar mide lo precisa que es una estimación (normalmente una media): la desviación estándar dividida entre la raíz cuadrada del tamaño de la muestra. Más datos reducen el error estándar, no la desviación estándar.
Respuesta incorrecta común. "Son lo mismo", o usar la desviación estándar para las barras de error de una media.
Practica: Excel · El mismo promedio, días distintos con STDEV.SPractica: Excel · ¿STDEV.S o STDEV.P?
Respuesta modelo. Una tendencia que aparece en cada grupo se invierte o desaparece cuando se combinan los grupos, porque los grupos tienen tamaños y tasas base distintos. Un ejemplo inventado: la app convierte mejor que la web tanto en móvil como en escritorio, pero peor en conjunto, porque la mayor parte del tráfico de la app es móvil, donde todo convierte menos. Revisa siempre la mezcla que hay detrás de una tasa global.
Respuesta incorrecta común. Describirla como "una curiosidad estadística poco común". Aparece todo el tiempo en los informes por canal y por segmento.
Practica: Casos · Plantea la pregunta de conversión en móvilPractica: Casos · Verifica y construye el embudo web en SQL
Preguntas abiertas sobre un negocio. El entrevistador evalúa tu estructura y tus comprobaciones, no un único número correcto.
Respuesta modelo. Conviértelo en un objetivo SMART: específico (qué producto, canal o clientes), medible (qué métrica y qué punto de partida), alcanzable (según el crecimiento pasado), relevante (ligado a una prioridad del negocio) y con tiempo definido (para cuándo). Por ejemplo: aumentar un 10% los pedidos repetidos de los clientes de la app este trimestre frente al anterior. Después acuerda la definición de la métrica antes de sacar datos.
Respuesta incorrecta común. Empezar a sacar todas las tablas de ventas y a hacer gráficos antes de concretar la pregunta.
Respuesta modelo. Ingresos, desglosados en pedidos × valor promedio del pedido; tasa de conversión (pedidos ÷ sesiones); clientes nuevos frente a recurrentes; tasa de devolución o reembolso; y costo de marketing por pedido. Cada una con la misma semana del año anterior como contexto y un responsable por métrica. Pocas métricas bien definidas son mejores que una pared de gráficos.
Respuesta incorrecta común. Listar veinte métricas sin definiciones y sin punto de comparación.
Practica: SQL · Desafío final: foto de rendimientoPractica: Casos · Revisión de la temporada navideña en SQL
Respuesta modelo. Primero revisa los datos: ¿la semana está completa?, ¿cambió el seguimiento o algún proceso de carga? Luego divide los ingresos en pedidos × valor promedio del pedido y mira cuál se movió. Desglosa el que bajó por canal, dispositivo, categoría, clientes nuevos frente a recurrentes, y compáralo con la misma semana del año anterior por la estacionalidad. Reporta el factor principal con un número, y qué descartaste.
Respuesta incorrecta común. Saltar a una causa ("el cambio de precios") antes de revisar los datos y descomponer la métrica.
Practica: Casos · Revisión de la temporada navideña en SQLPractica: Casos · Revisión de la temporada navideña en pandas
Respuesta modelo. Agrupa a los clientes en cohortes según el mes de su primer pedido y mide la proporción que vuelve a pedir dentro de una ventana fija (por ejemplo 90 días), o en cada mes posterior. Cuenta solo a los clientes que han tenido toda la ventana para volver (censura por la derecha) y compara cohortes en lugar de un único número global.
Respuesta incorrecta común. "Clientes recurrentes divididos entre todos los clientes", mezclando clientes que llegaron la semana pasada con clientes de hace tres años.
Practica: Casos · Retención de clientes en SQLPractica: Casos · Retención de clientes en pandas
Respuesta modelo. Menos sesiones (una caída de tráfico) con una mejor tasa pueden dar igualmente menos pedidos; o más pedidos con un valor promedio del pedido menor (descuentos, una mezcla más barata); o más cancelaciones y reembolsos después de la compra. Descompón los ingresos en sesiones × conversión × AOV × (1 − reembolsos) y comprueba qué término se movió.
Respuesta incorrecta común. "Los datos deben estar mal." Revísalos, pero esto es un efecto de mezcla normal.
Practica: SQL · Tasa de cancelación por canalPractica: Python · Desafío final: ¿quién convierte en el sitio web?
Respuesta modelo. Empieza con la respuesta y el número ("Las devoluciones nos costaron $X en el tercer trimestre, la mayor parte en Muebles dañados en el transporte"), luego el único gráfico que lo muestra, después qué recomiendas y qué tan seguro estás. Los métodos y las salvedades van después, brevemente. Usa sus palabras: pedidos y clientes, no filas y joins.
Respuesta incorrecta común. Recorrer las consultas en el orden en que las escribiste, terminando con el resultado.
Practica: Python · Desafío final: ¿de dónde vienen las devoluciones?
Respuesta modelo. Conoce la granularidad de cada tabla que unes y comprueba el número de filas antes y después de cada JOIN. Concilia un total con una fuente de confianza (los ingresos de finanzas, un panel). Revisa por muestreo algunos registros de punta a punta, busca NULL y duplicados en las claves y asegúrate de que filtros como el estado y las fechas correspondan a la pregunta.
Respuesta incorrecta común. "Confío en la consulta si se ejecuta sin errores."
Practica: SQL · Líneas por pedido sin contar doblePractica: Python · Desafío final: ¿de dónde vienen las devoluciones?
Respuesta modelo. El costo por conversión (gasto ÷ sesiones convertidas) de cada canal en el mismo periodo, junto con la tasa de conversión y el valor de esos pedidos, para que las conversiones baratas pero de poco valor no ganen por defecto. Agrega el gasto y las sesiones por separado antes de unirlos, o el JOIN multiplica el gasto.
WITH spend AS (
SELECT channel, SUM(amount) AS spend
FROM marketing_spend
GROUP BY channel
), conv AS (
SELECT source AS channel, COUNT(*) FILTER (WHERE converted) AS conversions
FROM web_sessions
GROUP BY source
)
SELECT s.channel, s.spend, c.conversions,
ROUND(s.spend / NULLIF(c.conversions, 0), 2) AS cost_per_conversion
FROM spend AS s
LEFT JOIN conv AS c ON c.channel = s.channel; Respuesta incorrecta común. Ordenar los canales por conversiones totales, lo que premia al canal con el presupuesto más grande.
Practica: Casos · Costo por conversión en SQLPractica: Casos · Costo por conversión en pandas
Respuesta modelo. Los calendarios se desplazan: el Black Friday cae en otra fecha y el periodo puede no tener el mismo número de fines de semana. Alinea por evento (del Black Friday al Cyber Monday) o por día de la semana, asegúrate de que ambos años estén completos y mantén las mismas reglas de estado (solo pedidos completados, o netos de reembolsos) en los dos años.
Respuesta incorrecta común. Comparar del 1 al 30 de noviembre entre años sin comprobar dónde cae el Black Friday.
Practica: Casos · Revisión de la temporada navideña en SQLPractica: Casos · Revisión de la temporada navideña en pandas
Hoja de referencia
Una página para repasar el SQL que te van a preguntar, para imprimir.
Hoja de referencia
Una página para repasar el pandas que te van a preguntar, para imprimir.
Hoja de referencia
Una página para repasar el Excel que te van a preguntar, para imprimir.