0Pricing
SQL Interview Prep · Lección

Retención del día N y retención móvil

La diferencia entre las definiciones de retención clásica, móvil y acotada.

Retención del día N y retención móvil es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 3 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é la retención tiene varias definiciones

Un entrevistador rara vez se limitará a decirle «calcule la retención». La pregunta de seguimiento incisiva es: ¿qué retención? Los mismos datos producen cifras muy distintas según la definición.

Debe conocer estas tres: retención Day-N (clásica), retención rolling (sin límite) y retención en ventana acotada. Conocer la diferencia y preguntar cuál necesita el negocio es, en sí mismo, la habilidad que se está evaluando.

Retención Day-N (clásica)

La retención Day-N pregunta si el usuario estuvo activo exactamente el día N después de su primera acción. Day-1, Day-7 y Day-30 son las métricas clásicas de las aplicaciones móviles.

La palabra clave es exactamente. Un usuario que estuvo activo los días 6 y 8, pero no el día 7, no se considera retenido en Day-7 según la definición clásica. Esta precisión hace que el conteo sea estricto y que la curva sea irregular.

Calcular la diferencia entre días

La retención Day-N depende del número de días entre el inicio de la cohorte y cada día de actividad. En Postgres, restar dos fechas produce directamente un conteo entero de días.

En otros dialectos: DATEDIFF(day, start, d) en SQL Server y DATEDIFF(d, start) en MySQL. Indique el dialecto; el concepto, un desplazamiento en días, es idéntico.

WITH cohort AS (
  SELECT user_id, MIN(event_at::date) AS day0
  FROM events GROUP BY user_id
),
act AS (
  SELECT DISTINCT user_id, event_at::date AS day
  FROM events
)
SELECT c.user_id, (a.day - c.day0) AS day_n
FROM cohort c
JOIN act a ON a.user_id = c.user_id;

Una consulta de retención Day-7

Para obtener la tasa de retención Day-7, cuente los usuarios distintos cuyo desplazamiento en días sea igual a 7 y divídalos entre el tamaño de la cohorte. Use agregación condicional para que tanto el numerador como el denominador provengan de una sola lectura.

La igualdad = 7, y no >= 7, es la característica distintiva de la retención clásica. Sustituirla por una desigualdad cambia silenciosamente la definición.

WITH dn AS (
  SELECT c.user_id, (a.day - c.day0) AS day_n
  FROM cohort c JOIN act a ON a.user_id = c.user_id
)
SELECT
  COUNT(DISTINCT CASE WHEN day_n = 7 THEN user_id END) AS d7_retained,
  COUNT(DISTINCT user_id)                               AS cohort_size,
  ROUND(100.0 * COUNT(DISTINCT CASE WHEN day_n = 7 THEN user_id END)
        / NULLIF(COUNT(DISTINCT user_id), 0), 1)         AS d7_pct
FROM dn;

Retención rolling (sin límite)

La retención rolling en el día N plantea una pregunta más flexible: ¿el usuario estuvo activo el día N o cualquier día posterior? Considera retenido en el día 7 a un usuario que regresó el día 7, el día 20 o en cualquier momento posterior.

Esto produce una curva más uniforme y alta, y suele preferirse para medir la adhesión a largo plazo. El cambio característico consiste en pasar de = N a >= N sobre el día máximo de actividad.

Retención rolling con MAX del día

La forma más clara de calcular la retención rolling es encontrar el último desplazamiento del día activo de cada usuario mediante MAX; después, un usuario se considera retenido en modo rolling en el día N si ese máximo es >= N.

Después de aplicar MAX, cada usuario equivale a una fila, por lo que el conteo es sencillo. Esto también deja claro que la retención rolling es monótona: si un usuario está retenido en el día 30, lo está en todos los valores menores de N.

WITH last_day AS (
  SELECT c.user_id, MAX(a.day - c.day0) AS max_day_n
  FROM cohort c JOIN act a ON a.user_id = c.user_id
  GROUP BY c.user_id
)
SELECT
  COUNT(*)                                          AS cohort_size,
  COUNT(*) FILTER (WHERE max_day_n >= 7)            AS rolling_d7,
  ROUND(100.0 * COUNT(*) FILTER (WHERE max_day_n >= 7)
        / NULLIF(COUNT(*), 0), 1)                    AS rolling_d7_pct
FROM last_day;

Retención en una ventana acotada

El punto intermedio es la retención en una ventana acotada: estar activo al menos una vez dentro de una ventana alrededor del día N, por ejemplo, entre los días 5 y 9 para una métrica de la «semana 1». Tolera que los usuarios no estén activos el día exacto, pero suaviza menos que la retención totalmente rolling.

Esta es la definición más realista para el negocio, porque el uso real suele producirse en ráfagas. La consulta utiliza BETWEEN sobre el desplazamiento en días.

SELECT
  COUNT(DISTINCT CASE WHEN day_n BETWEEN 5 AND 9
                      THEN user_id END) AS week1_retained,
  COUNT(DISTINCT user_id)               AS cohort_size
FROM dn;

Tres definiciones, un mismo usuario

Haga concreta la diferencia. Un usuario comienza en el día 0 y después solo está activo el día 9.

  • Day-7 clásica: NO se considera retenido (no hubo actividad exactamente el día 7).
  • Day-7 rolling: se considera retenido (el día máximo es 9 >= 7).
  • Ventana acotada 5–9, semana 1: se considera retenido (el día 9 cae dentro de la ventana).

Los mismos datos producen tres respuestas. En una entrevista, explique un ejemplo como este para demostrar que entiende la semántica y no solo la sintaxis.

Granularidad del período: día frente a semana y mes

«Day-N» se generaliza como period-N. En un producto B2B con uso mensual, la retención diaria es ruido; debería agrupar por mes y preguntar por el mes N. La mecánica es idéntica: solo cambia el nivel de truncamiento.

Elija el nivel que corresponda a la cadencia de uso natural del producto y explíquelo. Diario para aplicaciones móviles de consumo; semanal o mensual para herramientas B2B de uso más lento.

-- weekly grain: offset in whole weeks
SELECT
  c.user_id,
  FLOOR((a.day - c.day0) / 7) AS week_n
FROM cohort c
JOIN act a ON a.user_id = c.user_id;

La trampa de la supervivencia y la madurez

Una pregunta sutil para perfiles sénior: no informe la retención Day-30 de una cohorte que solo tiene 10 días de antigüedad. Todavía no ha tenido la oportunidad de estar activa en el día 30, por lo que su valor es artificialmente 0 y no indica una retención realmente baja.

Protéjase incluyendo únicamente las cohortes cuya antigüedad sea >= N al informar Day-N. Filtre mediante CURRENT_DATE - day0 >= N. Olvidar esto hace que las cohortes recientes parezcan catastróficamente deficientes.

WITH cohort AS (
  SELECT user_id, MIN(event_at::date) AS day0
  FROM events GROUP BY user_id
)
SELECT *
FROM cohort
WHERE (CURRENT_DATE - day0) >= 30;  -- mature enough for Day-30

Elegir una definición en voz alta

La mejor respuesta en una entrevista no es una consulta, sino una pregunta de vuelta: «¿Desea Day-N clásica, rolling o una ventana acotada? ¿Y cuál es el período natural?»

A continuación, exponga la diferencia: la clásica es estricta y adecuada para interacciones exactas del producto; la rolling sobreestima la retención a corto plazo, pero captura la adhesión a lo largo de la vida; la acotada es el compromiso realista. Demostrar que elige la métrica de forma deliberada es el objetivo central de esta lección.

Comprobación rápida

La primera acción de un usuario ocurre el día 0 y su única actividad posterior ocurre el día 12. Según cada definición, ¿se considera retenido en Day-7?

Resumen: definiciones de retención

Conclusiones sobre la retención Day-N y rolling:

  • Day-N clásica: actividad exactamente el día N (desplazamiento = N) — curva estricta e irregular.
  • Rolling: actividad el día N o después (MAX offset >= N) — más uniforme, monótona y orientada a medir la adhesión.
  • Acotada: actividad dentro de una ventana (BETWEEN) — el compromiso realista.
  • Generalice el día a cualquier nivel de granularidad del período que corresponda a la cadencia del producto.
  • Informe Day-N únicamente para cohortes maduras (antigüedad >= N) para evitar la trampa de la supervivencia y pregunte siempre qué definición desea decir el negocio.

Preguntas frecuentes

¿La lección «Retención del día N y retención móvil» es gratis?

Sí — el texto completo de «Retención del día N y retención móvil» 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 «Retención del día N y retención móvil»?

La diferencia entre las definiciones de retención clásica, móvil y acotada. 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 3 de 4.

¿Cuánto tiempo toma la lección «Retención del día N y retención móvil»?

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. Definir una cohorte por la primera acción
  2. Crear una matriz de retención
  3. Retención del día N y retención móvil
  4. Consultas de abandono y reactivación
← Volver a SQL Interview Prep