0Pricing
SQL Interview Prep · Lección

Racha activa actual hasta hoy

Calcular una racha en curso y reiniciarla cuando se interrumpe.

Racha activa actual hasta hoy es una lección gratuita de SQL 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 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.

La pregunta del producto

Las funciones de rachas (piense en Duolingo o Snapchat) necesitan la racha actual, no la más larga de todo el historial. La pregunta de la entrevista es: "Para cada usuario, ¿cuántos días consecutivos hasta hoy ha estado activo? La racha debe volver a 0 si no estuvo activo hoy."

Esto añade una particularidad: la racha debe estar anclada a hoy (o a ayer, si se permite un día de gracia). Vamos a construirla sobre los fundamentos de brechas e islas que ya conoce.

Definir la actividad

Primero, aclare las reglas con el entrevistador — estas decisiones cambian la consulta:

  • ¿La racha requiere actividad hoy o se acepta ayer (periodo de gracia)?
  • ¿Se agrupan varios eventos del mismo día en un único día?
  • ¿Qué zona horaria define un "día"?

Supondremos que hay una fila por día activo y que la racha está vigente si incluye hoy O ayer.

Volver a construir las islas

Reutilice el ancla: numere los días de cada usuario por fecha y haga una resta. Cada secuencia consecutiva comparte un ancla. La racha actual es simplemente la isla cuyo último día es hoy o ayer.

WITH numbered AS (
  SELECT user_id, login_date,
    ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY login_date
    ) AS rn
  FROM logins
),
islands AS (
  SELECT user_id,
    MIN(login_date) AS streak_start,
    MAX(login_date) AS streak_end,
    COUNT(*)        AS streak_len
  FROM numbered
  GROUP BY user_id, login_date - rn
)
SELECT * FROM islands;

Identificar la isla más reciente

La isla más reciente de cada usuario es la que tiene el mayor valor de streak_end. Comprobamos si ese final es lo suficientemente reciente como para considerar que la racha sigue activa.

CURRENT_DATE proporciona la fecha de hoy. CURRENT_DATE - 1 es la fecha de ayer. Si streak_end coincide con cualquiera de las dos, la racha sigue activa.

WITH /* ...numbered, islands... */
latest AS (
  SELECT *,
    ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY streak_end DESC
    ) AS rn2
  FROM islands
)
SELECT * FROM latest WHERE rn2 = 1;

Aplicar la prueba de actualidad

Ahora determine si la isla más reciente está activa. Si su fecha final es hoy o ayer, la racha actual es igual a su longitud; de lo contrario, el usuario ha interrumpido la racha y el valor actual es 0.

SELECT user_id,
  CASE
    WHEN streak_end >= CURRENT_DATE - 1
    THEN streak_len
    ELSE 0
  END AS current_streak
FROM latest
WHERE rn2 = 1;

La consulta completa de la racha actual

Integre todas las capas: numere, construya las islas, seleccione la más reciente de cada usuario y, después, aplique el CASE de actualidad. Esta es la respuesta completa.

WITH numbered AS (
  SELECT user_id, login_date,
    ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY login_date
    ) AS rn
  FROM logins
),
islands AS (
  SELECT user_id,
    MAX(login_date) AS streak_end,
    COUNT(*)        AS streak_len
  FROM numbered
  GROUP BY user_id, login_date - rn
),
latest AS (
  SELECT *,
    ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY streak_end DESC
    ) AS rn2
  FROM islands
)
SELECT user_id,
  CASE WHEN streak_end >= CURRENT_DATE - 1
       THEN streak_len ELSE 0 END AS current_streak
FROM latest
WHERE rn2 = 1
ORDER BY user_id;

Exigencia de actividad solo hoy

Si la regla de negocio es estricta — la racha está activa solo si el usuario estuvo activo hoy — cambie la comparación para exigir streak_end = CURRENT_DATE.

La versión con periodo de gracia (>= CURRENT_DATE - 1) es más flexible y habitual en aplicaciones reales, donde el día todavía no ha terminado. Confirme siempre qué opción quiere el entrevistador.

CASE WHEN streak_end = CURRENT_DATE
     THEN streak_len ELSE 0 END AS current_streak

Una alternativa: retroceder día a día

Otro modelo mental que algunos entrevistadores prefieren consiste en calcular la distancia entre cada día y hoy. Un día forma parte de la racha actual solo si están presentes todos los días desde ese día hasta hoy. De forma equivalente, compare login_date con CURRENT_DATE - (offset from the latest).

El método de islas suele ser más claro, pero conocer una alternativa demuestra profundidad. La idea clave es la misma: una cadena ininterrumpida anclada en hoy.

Incluir usuarios inactivos

Los usuarios ausentes de logins no tienen ninguna isla y desaparecen. Si debe informar una racha para todos los usuarios (probablemente 0), haga un LEFT JOIN de la lista de usuarios y use COALESCE para convertir el resultado en 0.

SELECT u.user_id,
  COALESCE(s.current_streak, 0) AS current_streak
FROM users u
LEFT JOIN current_streaks s ON s.user_id = u.user_id;

Problemas con las zonas horarias

Si la actividad se almacena como marcas de tiempo, "hoy" depende de la zona horaria. Haga la conversión antes de truncar a una fecha.

  • Almacene y compare en UTC, o convierta primero a la zona local del usuario.
  • En Postgres, use event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tz y convierta después a date.
  • Aplicar ::date directamente a una marca de tiempo UTC puede situar un evento vespertino en el día natural equivocado.

Mencionar este punto evita una pregunta de seguimiento clásica.

SELECT user_id,
  (event_ts AT TIME ZONE 'UTC'
             AT TIME ZONE 'America/New_York')::date AS local_day
FROM events;

Rendimiento y conclusión

En paneles que se actualizan con frecuencia, esta consulta se ejecuta por usuario en un único recorrido. Para mantenerla ágil:

  • Indexe (user_id, login_date).
  • Opcionalmente, limite la entrada a fechas recientes — una racha actual no puede incluir datos más antiguos que su propia longitud, por lo que una ventana móvil de, por ejemplo, los últimos 400 días es suficiente.
  • Materialice los datos diarios en una tabla de rachas si se consultan con mucha frecuencia.

Comprobación rápida

Confirme que entiende el ancla respecto a "ahora".

Resumen

Para calcular la racha activa actual hasta hoy:

  • Construya islas con el ancla login_date - ROW_NUMBER().
  • Seleccione la isla más reciente de cada usuario mediante el valor máximo de streak_end.
  • Devuelva su longitud solo si streak_end es hoy (o ayer si se permite un periodo de gracia); en caso contrario, devuelva 0.
  • Haga un LEFT JOIN de users para incluir las cuentas inactivas y gestione las zonas horarias antes de truncar a una fecha.

Ahora domina todo el conjunto de herramientas para analizar rachas: detectar secuencias, calcular la racha más larga, identificar condiciones de N elementos consecutivos y obtener la racha activa.

Preguntas frecuentes

¿La lección «Racha activa actual hasta hoy» es gratis?

Sí — el texto completo de «Racha activa actual hasta hoy» 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 «Racha activa actual hasta hoy»?

Calcular una racha en curso y reiniciarla cuando se interrumpe. 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 4 de 4.

¿Cuánto tiempo toma la lección «Racha activa actual hasta hoy»?

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. Detectar días consecutivos del calendario
  2. Racha más larga por usuario
  3. N filas consecutivas que cumplen una condición
  4. Racha activa actual hasta hoy
← Volver a SQL Interview Prep