0Pricing
SQL Interview Prep · Lección

Eventos ordenados y ventanas temporales

Garantizar que los pasos ocurran en secuencia y dentro de un límite de tiempo mediante funciones de ventana.

Eventos ordenados y ventanas temporales es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 2 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.

Por qué importan el orden y el tiempo

El embudo básico de la lección anterior solo comprueba si un usuario realizó cada paso. Un entrevistador más exigente preguntará: ¿ocurrieron los pasos en el orden correcto y dentro de un plazo razonable?

Un usuario que realizó una compra el lunes y visitó la página de marketing el viernes no pasó por su embudo. La secuencia y el tiempo transforman un embudo ingenuo basado en indicadores en uno fiable.

La idea de la primera marca de tiempo por usuario

Para razonar sobre el orden, capture la primera vez que cada usuario realizó cada paso: la primera visita, el primer registro y la primera compra.

Después, una conversión válida significa que first_signup_time >= first_visit_time, y lo mismo para el resto de la cadena. Agrupar MIN(event_time) por paso proporciona esas referencias.

SELECT
  user_id,
  MIN(CASE WHEN event_name = 'visit'    THEN event_time END) AS first_visit,
  MIN(CASE WHEN event_name = 'signup'   THEN event_time END) AS first_signup,
  MIN(CASE WHEN event_name = 'purchase' THEN event_time END) AS first_purchase
FROM events
GROUP BY user_id;

Exigir los pasos en secuencia

Con las primeras marcas de tiempo de cada paso, aplicar el orden se reduce a una comparación. Un usuario llegó realmente al paso 3 solo si cada marca de tiempo no es nula y aumenta de forma monótona.

Observe que una marca de tiempo NULL (el paso nunca ocurrió) no supera de forma natural la comparación, exactamente como se necesita.

WITH t AS (
  SELECT user_id,
    MIN(CASE WHEN event_name='visit'    THEN event_time END) AS visit_t,
    MIN(CASE WHEN event_name='signup'   THEN event_time END) AS signup_t,
    MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
  FROM events GROUP BY user_id
)
SELECT COUNT(*) AS converted_in_order
FROM t
WHERE visit_t IS NOT NULL
  AND signup_t  >= visit_t
  AND purchase_t >= signup_t;

Añadir un intervalo temporal

La mayoría de los embudos tienen un plazo: "convertirse en un plazo de 7 días desde la primera visita". Añada un límite de intervalo entre el primer paso y el paso final.

La aritmética de fechas varía según el dialecto. En Postgres puede escribir visit_t + INTERVAL '7 days'; en MySQL, use DATE_ADD(visit_t, INTERVAL 7 DAY). Indique siempre el dialecto utilizado.

WITH t AS (
  SELECT user_id,
    MIN(CASE WHEN event_name='visit'    THEN event_time END) AS visit_t,
    MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
  FROM events GROUP BY user_id
)
SELECT COUNT(*) AS purchased_within_7d
FROM t
WHERE purchase_t >= visit_t
  AND purchase_t <  visit_t + INTERVAL '7 days';

Por qué usar la primera marca de tiempo y no cualquiera

Una cuestión sutil en las entrevistas es si el intervalo debe comenzar en la primera visita del usuario o en la más reciente antes del registro. Depende de la pregunta del producto.

  • Los intervalos de first-touch miden cuánto tiempo transcurre desde el interés inicial hasta la conversión.
  • Los intervalos de last-touch miden el tiempo de conversión posterior a la última visita.

Pregunte al entrevistador cuál de los dos quiere decir; elegir de forma deliberada demuestra experiencia.

Eventos ordenados con LEAD

Para rutas complejas de varios pasos, las funciones de ventana son muy útiles. Ordene por tiempo los eventos de cada usuario y use LEAD para consultar el evento siguiente y confirmar que es el siguiente paso esperado.

Esto permite gestionar rutas en las que se intercalan eventos no relacionados.

SELECT
  user_id,
  event_name,
  event_time,
  LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event,
  LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events;

Coincidencia con el siguiente paso esperado

Amplíe el uso de LEAD: conserve las filas en las que a un 'visit' le sigue inmediatamente un 'signup'. Así encontrará transiciones secuenciales reales, no simples coincidencias.

Puede encadenar estas comprobaciones de transición para validar una ruta ordenada completa paso a paso.

WITH seq AS (
  SELECT user_id, event_name, event_time,
    LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event
  FROM events
)
SELECT COUNT(DISTINCT user_id) AS visit_then_signup
FROM seq
WHERE event_name = 'visit' AND next_event = 'signup';

Tiempo entre pasos consecutivos

A los entrevistadores les encanta preguntar "¿cuánto tarda cada paso?". Use LEAD sobre la marca de tiempo y réstela. La diferencia entre eventos consecutivos es el tiempo de permanencia en esa etapa.

Calcule la mediana o el promedio de cada transición para encontrar la etapa más lenta del embudo.

WITH seq AS (
  SELECT user_id, event_name, event_time,
    LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
  FROM events
)
SELECT
  event_name,
  AVG(EXTRACT(EPOCH FROM (next_time - event_time)) / 3600.0) AS avg_hours_to_next
FROM seq
WHERE next_time IS NOT NULL
GROUP BY event_name;

El caso límite de la misma marca de tiempo

¿Qué ocurre si dos eventos comparten exactamente el mismo event_time? Entonces signup_t >= visit_t es verdadero aunque sean simultáneos, y el orden basado únicamente en el tiempo resulta ambiguo.

  • Use >= o > deliberadamente y explique por qué.
  • Añada un criterio de desempate, como un identificador de secuencia del evento, a ORDER BY para que las ventanas sean deterministas.

Mencionar esto sin que se lo pidan impresiona a los entrevistadores.

SELECT user_id, event_name,
  ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_time, event_id) AS step_seq
FROM events;

Combinación del orden y el intervalo en una sola consulta

Este es el embudo completo con los pasos en orden y dentro del intervalo. Toma como referencia la primera visita, exige que la primera aparición de cada paso posterior sea posterior al paso anterior y limita toda la ruta a 7 días.

Esta es la respuesta que diferencia a un candidato que entiende los embudos de otro que solo cuenta indicadores.

WITH t AS (
  SELECT user_id,
    MIN(CASE WHEN event_name='visit'    THEN event_time END) AS v,
    MIN(CASE WHEN event_name='signup'   THEN event_time END) AS s,
    MIN(CASE WHEN event_name='purchase' THEN event_time END) AS p
  FROM events GROUP BY user_id
)
SELECT
  COUNT(*) FILTER (WHERE v IS NOT NULL)                                   AS visited,
  COUNT(*) FILTER (WHERE s >= v AND s < v + INTERVAL '7 days')            AS signed_up,
  COUNT(*) FILTER (WHERE s >= v AND p >= s AND p < v + INTERVAL '7 days') AS purchased
FROM t;

Notas sobre distintos dialectos

Dos recordatorios de portabilidad para la programación en directo:

  • FILTER (WHERE ...) en funciones de agregación forma parte de SQL estándar y funciona en Postgres; en MySQL o en motores antiguos, use como alternativa SUM(CASE WHEN ... THEN 1 ELSE 0 END).
  • La sintaxis de los intervalos varía: Postgres + INTERVAL '7 days', MySQL DATE_ADD(d, INTERVAL 7 DAY), SQL Server DATEADD(day, 7, d).

Indique su suposición y al entrevistador rara vez le importará el dialecto elegido; lo importante es que sepa que difieren.

Comprobación rápida

Debe contar los usuarios que completaron visita -> registro -> compra en ese orden, dentro de los 7 días posteriores a la primera visita. ¿Qué enfoque es correcto?

Repaso: eventos ordenados y ventanas temporales

Conclusiones clave:

  • Capture la primera marca de tiempo de cada paso de cada usuario con MIN(CASE ...).
  • Exija que la hora de cada paso sea posterior o igual a la del paso anterior para garantizar la secuencia.
  • Limite el recorrido con un intervalo e indique la sintaxis de su dialecto.
  • Use LEAD/LAG para comprobar transiciones y calcular el tiempo de permanencia entre pasos.
  • Gestione los empates con la misma marca de tiempo mediante un criterio de desempate en ORDER BY.

Siguiente: pasar de los embudos a los experimentos y calcular métricas por variante.

Preguntas frecuentes

¿La lección «Eventos ordenados y ventanas temporales» es gratis?

Sí — el texto completo de «Eventos ordenados y ventanas temporales» 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 «Eventos ordenados y ventanas temporales»?

Garantizar que los pasos ocurran en secuencia y dentro de un límite de tiempo mediante funciones de ventana. 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 2 de 4.

¿Cuánto tiempo toma la lección «Eventos ordenados y ventanas temporales»?

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

  1. Crear un embudo de varios pasos
  2. Eventos ordenados y ventanas temporales
  3. Asignación y métricas de pruebas A/B
  4. Incremento, significancia y controles en SQL
← Volver a SQL Interview Prep