0Pricing
SQL Interview Prep · Leçon

Série active en cours aujourd’hui

Calcul d’une série en cours et réinitialisation lorsqu’elle est interrompue

Série active en cours aujourd’hui est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

La question produit

Les fonctionnalités de série (pensez à Duolingo ou Snapchat) nécessitent la série actuelle, et non la plus longue série historique. La question d'entretien est la suivante : « Pour chaque utilisateur, combien de jours consécutifs se terminant aujourd'hui a-t-il été actif ? Ramenez la valeur à 0 s'il n'a pas été actif aujourd'hui. »

Cela ajoute une subtilité : la série doit être ancrée à aujourd'hui (ou à hier avec une règle de tolérance). Construisons-la à partir des fondations des écarts et des îlots que vous connaissez déjà.

Définir l'activité

Commencez par clarifier les règles avec le recruteur — ces décisions modifient la requête :

  • La série exige-t-elle une activité aujourd'hui, ou hier est-il acceptable (période de tolérance) ?
  • Les événements multiples d'une même journée sont-ils regroupés en une seule journée ?
  • Quel fuseau horaire définit un « jour » ?

Nous supposerons qu'il y a une ligne par jour actif et que la série est actuelle si elle inclut aujourd'hui OR hier.

Reconstruire les îlots

Réutilisez l'ancre : numérotez les jours de chaque utilisateur par date et effectuez une soustraction. Chaque série consécutive partage une même ancre. La série actuelle est simplement l'îlot dont le dernier jour est aujourd'hui ou hier.

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;

Identifier l'îlot le plus récent

L'îlot le plus récent de chaque utilisateur est celui dont la valeur streak_end est la plus grande. Nous vérifions si cette fin est suffisamment récente pour être considérée comme active.

CURRENT_DATE donne la date d'aujourd'hui. CURRENT_DATE - 1 correspond à hier. Si streak_end est égale à l'une de ces deux dates, la série est active.

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;

Vérifier la récence

Décidez maintenant si l'îlot le plus récent est actif. Si sa date de fin est aujourd'hui ou hier, la série actuelle correspond à sa longueur ; sinon, l'utilisateur a interrompu sa série et la valeur actuelle est 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 requête complète de la série actuelle

Assemblez toutes les couches : numérotez, construisez les îlots, sélectionnez le plus récent pour chaque utilisateur, puis appliquez la CASE de récence. C'est la réponse complète.

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;

Rigueur : aujourd'hui uniquement

Si la règle métier est stricte — la série est active uniquement si l'utilisateur a été actif aujourd'hui — modifiez la comparaison pour exiger streak_end = CURRENT_DATE.

La version avec période de tolérance (>= CURRENT_DATE - 1) est plus souple et courante dans les applications réelles, où la journée n'est pas encore terminée. Vérifiez toujours quelle version le recruteur attend.

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

Une autre approche : remonter dans le temps

Voici un autre modèle mental que certains recruteurs préfèrent : calculez l'écart entre chaque jour et aujourd'hui. Un jour fait partie de la série actuelle uniquement si chaque jour compris entre ce jour et aujourd'hui est présent. De façon équivalente, comparez login_date à CURRENT_DATE - (offset from the latest).

La méthode des îlots est généralement plus claire, mais connaître une autre approche montre votre maîtrise du sujet. L'idée essentielle reste la même : une chaîne ininterrompue ancrée à aujourd'hui.

Inclure les utilisateurs inactifs

Les utilisateurs absents de logins n'ont aucun îlot et disparaissent. Si chaque utilisateur doit renvoyer une série (vraisemblablement 0), utilisez LEFT JOIN sur la liste des utilisateurs et ramenez le résultat à 0 avec COALESCE.

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;

Pièges liés aux fuseaux horaires

Si l'activité est stockée sous forme d'horodatages, la notion d'« aujourd'hui » dépend du fuseau horaire. Effectuez la conversion avant de tronquer en date.

  • Stockez et comparez les données en UTC, ou convertissez-les d'abord dans le fuseau horaire local de l'utilisateur.
  • Utilisez event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tz dans Postgres, puis convertissez en date.
  • Un ::date appliqué naïvement à un horodatage UTC peut placer un événement du soir sur le mauvais jour calendaire.

Le fait de le mentionner permet d'anticiper une question de suivi classique.

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

Performances et conclusion

Pour les tableaux de bord actualisés fréquemment, cette requête s'exécute pour chaque utilisateur en un seul parcours. Pour la garder rapide :

  • Créez un index sur (user_id, login_date).
  • Limitez éventuellement les données d'entrée aux dates récentes — une série actuelle ne peut pas inclure de données plus anciennes que sa propre longueur, donc une fenêtre glissante des 400 derniers jours, par exemple, suffit largement.
  • Matérialisez les données quotidiennes dans une table de séries si elles sont lues très souvent.

Vérification rapide

Vérifiez que vous comprenez l'ancrage sur « maintenant ».

Récapitulatif

Pour calculer la série active actuelle à la date d'aujourd'hui :

  • Construisez des îlots avec l'ancre login_date - ROW_NUMBER().
  • Sélectionnez l'îlot le plus récent de chaque utilisateur selon la valeur maximale de streak_end.
  • Renvoyez sa longueur uniquement si streak_end correspond à aujourd'hui (ou à hier avec une période de tolérance), sinon renvoyez 0.
  • Utilisez LEFT JOIN sur users pour les comptes inactifs ; gérez les fuseaux horaires avant de tronquer en date.

Vous maîtrisez maintenant toute la boîte à outils d'analyse des séries : détection des séries, plus longue série, conditions sur N lignes consécutives et série active.

Questions Fréquemment Posées

La leçon « Série active en cours aujourd’hui » est-elle gratuite ?

Oui — le texte complet de « Série active en cours aujourd’hui » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Série active en cours aujourd’hui » ?

Calcul d’une série en cours et réinitialisation lorsqu’elle est interrompue Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?

Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Série active en cours aujourd’hui » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?

Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Détecter les jours consécutifs du calendrier
  2. Plus longue série par utilisateur
  3. N lignes consécutives remplissant une condition
  4. Série active en cours aujourd’hui
← Retour à SQL Interview Prep