Crear un embudo de varios pasos
Contar los usuarios que alcanzan cada paso en orden y calcular las tasas de conversión entre pasos.
Crear un embudo de varios pasos es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 1 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 SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.
Qué evalúa realmente una pregunta sobre embudos
Cuando un entrevistador dice "construya un embudo de registro", está evaluando si puede contar los usuarios distintos que alcanzan cada paso ordenado y expresar la pérdida de usuarios entre ellos.
Un embudo tiene etapas como visit -> signup -> activate -> purchase. Normalmente, el resultado debe contener una fila por paso, con el número de usuarios y una tasa de conversión.
- Cuente usuarios, no eventos (si un usuario genera un evento dos veces, sigue siendo un solo usuario).
- Los pasos están ordenados: alcanzar el paso 3 implica haber superado los pasos 1 y 2.
La tabla de eventos que recibirá
Casi todas las preguntas sobre embudos le proporcionan una única tabla events en formato largo. Imagine esta estructura:
user_id, quien realizó la acciónevent_name, como 'visit', 'signup', 'purchase'event_time, una marca de tiempo
Hay una fila por acción. Su tarea es transformar estos datos en un recuento paso a paso. Confirme siempre con el entrevistador los nombres exactos de los eventos antes de escribir SQL.
CREATE TABLE events (
user_id INT,
event_name VARCHAR(50),
event_time TIMESTAMP
);Recuento de usuarios en un paso
Empiece por lo sencillo: ¿cuántos usuarios distintos alcanzaron un único paso? Use COUNT(DISTINCT user_id) con un filtro por nombre del evento.
Este es el componente básico de cualquier embudo. Si puede contar un paso correctamente, puede contarlos todos.
SELECT COUNT(DISTINCT user_id) AS users_who_signed_up
FROM events
WHERE event_name = 'signup';Agregación condicional para todos los pasos
La respuesta más clara en una entrevista cuenta todos los pasos en una sola pasada mediante agregación condicional: un CASE dentro de COUNT(DISTINCT ...).
Para cada paso, cuente los usuarios distintos cuyo evento coincide con ese paso. Un recorrido, una fila con los totales de los pasos.
SELECT
COUNT(DISTINCT CASE WHEN event_name = 'visit' THEN user_id END) AS step1_visit,
COUNT(DISTINCT CASE WHEN event_name = 'signup' THEN user_id END) AS step2_signup,
COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN user_id END) AS step3_purchase
FROM events;El error oculto: los pasos no están ordenados
La consulta que acaba de ver contiene una trampa que les encanta a los entrevistadores. Cuenta a cualquiera que haya generado el evento 'purchase', aunque nunca haya visitado el sitio ni se haya registrado según los datos.
Un embudo real exige que cada paso posterior sea un subconjunto del paso anterior. Contar los eventos de forma independiente puede producir más usuarios en el paso 3 que en el paso 2, algo lógicamente imposible en un embudo.
La solución es vincular los pasos de cada usuario, normalmente reduciendo primero los datos a una fila por usuario.
Una fila por usuario con indicadores
El patrón robusto consiste en reducir el registro de eventos a una fila por usuario, con un indicador booleano (representado como 0/1) que señale si alguna vez realizó cada paso. MAX(CASE ...) transforma el registro largo en un resumen ancho por usuario.
WITH user_steps AS (
SELECT
user_id,
MAX(CASE WHEN event_name = 'visit' THEN 1 ELSE 0 END) AS did_visit,
MAX(CASE WHEN event_name = 'signup' THEN 1 ELSE 0 END) AS did_signup,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS did_purchase
FROM events
GROUP BY user_id
)
SELECT * FROM user_steps;Aplicación del orden de los pasos
Ahora aplique la regla del embudo: un usuario solo cuenta para el paso N si también realizó todos los pasos anteriores. Alcanzar 'purchase' solo es relevante si también visitó el sitio y se registró.
Sume los indicadores incorporando con AND las condiciones de los prerrequisitos, de modo que cada paso sea realmente un subconjunto del anterior.
WITH user_steps AS (
SELECT
user_id,
MAX(CASE WHEN event_name = 'visit' THEN 1 ELSE 0 END) AS did_visit,
MAX(CASE WHEN event_name = 'signup' THEN 1 ELSE 0 END) AS did_signup,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS did_purchase
FROM events
GROUP BY user_id
)
SELECT
SUM(did_visit) AS step1_visit,
SUM(CASE WHEN did_visit = 1 AND did_signup = 1 THEN 1 ELSE 0 END) AS step2_signup,
SUM(CASE WHEN did_visit = 1 AND did_signup = 1 AND did_purchase = 1 THEN 1 ELSE 0 END) AS step3_purchase
FROM user_steps;Conversión de los recuentos a un resultado largo ordenado
A menudo, los entrevistadores prefieren una fila por paso en lugar de una única fila ancha. Convierta los totales anchos a un formato largo mediante un pequeño UNION ALL y añada un número de paso para establecer el orden.
Esto facilita mucho el cálculo de las tasas de conversión y la creación de gráficos en el siguiente paso.
WITH funnel AS (
SELECT 1 AS step_no, 'visit' AS step_name, 1000 AS users UNION ALL
SELECT 2, 'signup', 420 UNION ALL
SELECT 3, 'purchase', 95
)
SELECT step_no, step_name, users
FROM funnel
ORDER BY step_no;Tasa de conversión entre pasos
Hay dos tasas importantes, y el entrevistador le preguntará cuál quiere decir:
- Conversión del paso: usuarios en este paso divididos entre los usuarios del paso anterior.
- Conversión global: usuarios en este paso divididos entre los usuarios de la parte superior del embudo.
Use LAG para obtener el recuento del paso anterior y calcular la tasa entre pasos. Convierta el resultado a decimal para evitar la división entera.
WITH funnel AS (
SELECT 1 AS step_no, 'visit' AS step_name, 1000 AS users UNION ALL
SELECT 2, 'signup', 420 UNION ALL
SELECT 3, 'purchase', 95
)
SELECT
step_name,
users,
ROUND(100.0 * users / LAG(users) OVER (ORDER BY step_no), 1) AS step_conv_pct
FROM funnel
ORDER BY step_no;Conversión global desde el inicio
Para calcular la conversión global, divida cada paso entre el recuento del primer paso. FIRST_VALUE sobre el embudo ordenado fija ese número inicial en todas las filas.
Mencione siempre al entrevistador que evitó la división entera multiplicando por 100.0.
WITH funnel AS (
SELECT 1 AS step_no, 'visit' AS step_name, 1000 AS users UNION ALL
SELECT 2, 'signup', 420 UNION ALL
SELECT 3, 'purchase', 95
)
SELECT
step_name,
users,
ROUND(100.0 * users / FIRST_VALUE(users) OVER (ORDER BY step_no), 1) AS overall_pct
FROM funnel
ORDER BY step_no;Construcción del embudo completo
Esta es la respuesta integral que esperan los entrevistadores: reduzca los datos a indicadores por usuario, aplique el orden, convierta el resultado a un formato largo y calcule después ambas tasas. Explique el proceso en voz alta e indique la finalidad de cada CTE.
Esta estructura es escalable: para añadir un paso, basta con añadir un indicador y una fila de UNION ALL.
WITH user_steps AS (
SELECT user_id,
MAX(CASE WHEN event_name = 'visit' THEN 1 ELSE 0 END) AS s1,
MAX(CASE WHEN event_name = 'signup' THEN 1 ELSE 0 END) AS s2,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS s3
FROM events GROUP BY user_id
),
totals AS (
SELECT 1 AS step_no, 'visit' AS step_name, SUM(s1) AS users FROM user_steps UNION ALL
SELECT 2, 'signup', SUM(CASE WHEN s1=1 AND s2=1 THEN 1 ELSE 0 END) FROM user_steps UNION ALL
SELECT 3, 'purchase', SUM(CASE WHEN s1=1 AND s2=1 AND s3=1 THEN 1 ELSE 0 END) FROM user_steps
)
SELECT step_name, users,
ROUND(100.0 * users / LAG(users) OVER (ORDER BY step_no), 1) AS step_pct
FROM totals ORDER BY step_no;Comprobación rápida
Un entrevistador observa que su embudo muestra 95 usuarios en 'purchase', pero solo 80 en 'signup'. ¿Cuál es la causa más probable?
Resumen: embudos de varios pasos
Ya puede construir un embudo como esperan los entrevistadores:
- Cuente usuarios distintos por cada paso ordenado, nunca eventos sin procesar.
- Reduzca el registro de eventos a una fila por usuario con indicadores
MAX(CASE ...). - Aplique el orden para que cada paso sea un subconjunto del anterior.
- Calcule la conversión entre pasos (LAG) y la conversión global (FIRST_VALUE), evitando la división entera.
A continuación: comprobar que esos pasos ocurrieron realmente en la secuencia correcta y dentro de un intervalo temporal.
Preguntas frecuentes
¿La lección «Crear un embudo de varios pasos» es gratis?
Sí — el texto completo de «Crear un embudo de varios pasos» 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 SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Crear un embudo de varios pasos»?
Contar los usuarios que alcanzan cada paso en orden y calcular las tasas de conversión entre pasos. Practicas SQL 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 SQL Interview Prep?
No se requiere experiencia previa. SQL 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 1 de 4.
¿Cuánto tiempo toma la lección «Crear un embudo de varios pasos»?
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 SQL Interview Prep?
Sí. Cada lección de SQL 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
- Crear un embudo de varios pasos
- Eventos ordenados y ventanas temporales
- Asignación y métricas de pruebas A/B
- Incremento, significancia y controles en SQL