SQL Interview Prep · Lektion

Aktuelle aktive Serie bis heute

Berechnen Sie eine laufende Serie und setzen Sie sie bei einer Unterbrechung zurück.

Lektion 4 von 413 Schritte

Aktuelle aktive Serie bis heute ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Die Produktfrage

Streak-Funktionen (denken Sie an Duolingo oder Snapchat) benötigen die aktuelle Streak, nicht die historisch längste. Die Frage im Vorstellungsgespräch lautet: „An wie vielen aufeinanderfolgenden Tagen bis einschließlich heute war jeder Benutzer aktiv? Setzen Sie den Wert auf 0 zurück, wenn der Benutzer heute nicht aktiv war.“

Das bringt eine Besonderheit mit sich: Die Streak muss an heute verankert sein (oder gemäß einer Kulanzregel an gestern). Wir bauen sie auf der Grundlage des Ihnen bereits bekannten Lücken-und-Inseln-Musters auf.

Aktivität definieren

Klären Sie zunächst die Regeln mit Ihrem Interviewer — diese Entscheidungen verändern die Abfrage:

  • Erfordert die Streak Aktivität heute, oder ist gestern ebenfalls zulässig (Kulanzzeitraum)?
  • Werden mehrere Ereignisse pro Tag zu einem Tag zusammengefasst?
  • Welche Zeitzone definiert einen „Tag“?

Wir nehmen an, dass es eine Zeile pro aktivem Tag gibt und die Streak aktuell ist, wenn sie heute ODER gestern einschließt.

Die Inseln erneut bilden

Verwenden Sie den Anker erneut: Nummerieren Sie die Tage jedes Benutzers nach Datum und subtrahieren Sie die Nummer. Jede aufeinanderfolgende Folge hat denselben Anker. Die aktuelle Streak ist einfach die Insel, deren letzter Tag heute oder gestern ist.

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;

Die letzte Insel ermitteln

Die zeitlich letzte Insel jedes Benutzers ist diejenige mit dem größten streak_end. Wir prüfen, ob dieses Ende aktuell genug ist, um als laufend zu gelten.

CURRENT_DATE liefert das heutige Datum. CURRENT_DATE - 1 ist gestern. Wenn streak_end einem dieser beiden Werte entspricht, ist die Streak aktiv.

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;

Die Aktualität prüfen

Entscheiden Sie nun, ob die letzte Insel aktiv ist. Liegt ihr Enddatum heute oder gestern, entspricht die aktuelle Streak ihrer Länge. Andernfalls hat der Benutzer seine Streak unterbrochen und der aktuelle Wert ist 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;

Die vollständige Abfrage für die aktuelle Streak

Fügen Sie alle Ebenen zusammen: Nummerieren Sie die Zeilen, bilden Sie die Inseln, wählen Sie die letzte Insel pro Benutzer aus und wenden Sie anschließend das Recency-CASE an. Dies ist die vollständige Lösung.

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;

Strenge Regel: Nur heute

Wenn die Geschäftsregel streng ist — die Streak ist nur aktiv, wenn der Benutzer heute aktiv war — ändern Sie den Vergleich so, dass streak_end = CURRENT_DATE erforderlich ist.

Die Version mit Kulanzzeitraum (>= CURRENT_DATE - 1) ist benutzerfreundlicher und in echten Anwendungen üblich, da der Tag noch nicht vorbei ist. Klären Sie immer, welche Variante der Interviewer erwartet.

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

Eine Alternative: rückwärts gehen

Ein anderes Denkmodell, das manche Interviewer bevorzugen: Berechnen Sie den Abstand jedes Tages bis heute. Ein Tag gehört nur dann zur aktuellen Streak, wenn jeder Tag von diesem Tag bis einschließlich heute vorhanden ist. Entsprechend vergleichen Sie login_date mit CURRENT_DATE - (offset from the latest).

Die Inselmethode ist normalerweise übersichtlicher, aber eine Alternative zu kennen, zeigt ein tieferes Verständnis. Die zentrale Idee ist dieselbe: eine ununterbrochene, an heute verankerte Kette.

Inaktive Benutzer einbeziehen

Benutzer, die in logins fehlen, haben keine Insel und verschwinden aus dem Ergebnis. Wenn für jeden Benutzer eine Streak ausgegeben werden muss (wahrscheinlich 0), verwenden Sie einen LEFT JOIN der Benutzerliste und setzen Sie das Ergebnis mit COALESCE auf 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;

Stolperfallen bei Zeitzonen

Wenn die Aktivität als Zeitstempel gespeichert wird, hängt „heute“ von der Zeitzone ab. Konvertieren Sie den Zeitstempel, bevor Sie ihn auf ein Datum kürzen.

  • Speichern und vergleichen Sie in UTC oder konvertieren Sie zuerst in die lokale Zeitzone des Benutzers.
  • Verwenden Sie in Postgres event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tz und wandeln Sie das Ergebnis anschließend in ein Datum um.
  • Ein naives ::date auf einem UTC-Zeitstempel kann ein Ereignis am Abend dem falschen Kalendertag zuordnen.

Wenn Sie dies erwähnen, kommen Sie einer klassischen Nachfrage zu diesem Problem zuvor.

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

Performance und Abschluss

Für häufig aktualisierte Dashboards wird diese Abfrage pro Benutzer in einem einzigen Durchlauf ausgeführt. Damit sie schnell bleibt:

  • Erstellen Sie einen Index auf (user_id, login_date).
  • Beschränken Sie die Eingabe optional auf aktuelle Daten — eine aktuelle Streak kann keine Daten enthalten, die älter als ihre eigene Länge sind, daher reicht ein gleitendes Fenster von beispielsweise 400 Tagen aus.
  • Materialisieren Sie die täglichen Daten in einer Streak-Tabelle, wenn sie sehr häufig gelesen werden.

Kurzer Test

Prüfen Sie, ob Sie den Anker für „jetzt“ verstanden haben.

Zusammenfassung

So berechnen Sie die aktuelle aktive Streak mit Stand heute:

  • Bilden Sie Inseln mit dem Anker login_date - ROW_NUMBER().
  • Wählen Sie anhand des maximalen streak_end die letzte Insel jedes Benutzers aus.
  • Geben Sie ihre Länge nur dann zurück, wenn streak_end heute ist (oder gestern bei einem Kulanzzeitraum), andernfalls 0.
  • Verwenden Sie einen LEFT JOIN von users für inaktive Konten und berücksichtigen Sie Zeitzonen, bevor Sie auf ein Datum kürzen.

Sie beherrschen nun das vollständige Werkzeugset für Streak-Analysen: Folgen erkennen, längste Streaks bestimmen, Bedingungen über N aufeinanderfolgende Zeilen prüfen und aktive Streaks ermitteln.

Kostenlos starten

Lerne SQL mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
30
Lektionen
120

Häufig gestellte Fragen

Ist die Lektion „Aktuelle aktive Serie bis heute“ kostenlos?

Ja — der vollständige Text von „Aktuelle aktive Serie bis heute“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Aktuelle aktive Serie bis heute“?

Berechnen Sie eine laufende Serie und setzen Sie sie bei einer Unterbrechung zurück. Du übst SQL Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um SQL Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. SQL Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Aktuelle aktive Serie bis heute“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser SQL Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede SQL Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Aufeinanderfolgende Kalendertage erkennen
  2. Längste Serie pro Benutzer
  3. N aufeinanderfolgende Zeilen mit erfüllter Bedingung
  4. Aktuelle aktive Serie bis heute
← Zurück zu SQL Interview Prep