Längste Serie pro Benutzer
Berechnen Sie die maximale Länge aufeinanderfolgender Einträge innerhalb jeder Gruppe.
Längste Serie pro Benutzer ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 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 Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Die Fragestellung
Eine häufige Anschlussfrage zur Erkennung aufeinanderfolgender Tage lautet: „Welche längste Folge aufeinanderfolgender aktiver Tage hat jeder Benutzer?“ Produkt- und Growth-Teams fragen das ständig, um Engagement zu messen.
Sie wissen bereits, wie Sie jede Folge erkennen. Der neue Schritt besteht darin, die maximale Länge pro Benutzer zu ermitteln und häufig zusätzlich die Daten dieser besten Folge zurückzugeben. Diese Lektion baut direkt auf dem Grundgerüst für Lücken und Inseln auf.
Den Inselaufbau wiederholen
Aus der vorherigen Lektion wissen Sie, dass die Gruppierung pro Folge login_date - ROW_NUMBER() als Inselanker verwendet. Jeder Benutzer kann mehrere Inseln haben; zunächst berechnen wir eine Zeile pro Insel und reduzieren anschließend auf eine Zeile pro Benutzer.
Behalten Sie diesen zweistufigen Plan im Blick: Zuerst erstellen Sie die Inseln, dann aggregieren Sie die Inseln.
WITH numbered AS (
SELECT user_id, login_date,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY login_date
) AS rn
FROM logins
)
SELECT user_id, login_date - rn AS grp
FROM numbered;Eine Zeile pro Insel
Fassen Sie jede Insel zu einer einzigen Zusammenfassungszeile zusammen, die ihre Länge und ihren Datumsbereich enthält. Gruppieren Sie nach Benutzer und Anker und berechnen Sie die Kennzahlen.
Wir nennen diese CTE islands, damit die nächste Ebene sauber darauf zugreifen kann.
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;Einfachste Antwort: maximale Länge
Wenn der Interviewer nur die Länge wissen möchte, besteht der letzte Schritt aus einer einzigen Zeile: Gruppieren Sie die Inseln nach Benutzer und ermitteln Sie die maximale Länge.
Das ist die sauberste Antwort, wenn Start- und Enddaten nicht benötigt werden.
-- ...numbered and islands CTEs as before...
SELECT
user_id,
MAX(streak_len) AS longest_streak
FROM islands
GROUP BY user_id
ORDER BY user_id;Zusätzlich die Daten zurückgeben
Oft ergänzt der Interviewer: „und zeigen Sie, wann diese Serie stattfand.“ Ein einfaches MAX kann nicht erkennen, welche Insel gewonnen hat. Sie müssen die Inseln für jeden Benutzer nach Rang ordnen und Rang 1 behalten.
Verwenden Sie ROW_NUMBER, sortiert nach absteigender Länge, damit die beste Folge jedes Benutzers Rang 1 erhält. Fügen Sie einen Tie-Breaker hinzu, damit Gleichstände deterministisch aufgelöst werden.
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY streak_len DESC, streak_start ASC
) AS rnkRang vergeben und filtern
Verpacken Sie die Rangvergabe in einer CTE und filtern Sie dann auf rnk = 1. Sie können in WHERE nicht direkt auf eine Fensterfunktion filtern, daher ist die zusätzliche Ebene zwingend erforderlich.
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
),
ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY streak_len DESC, streak_start
) AS rnk
FROM islands
)
SELECT user_id, streak_start, streak_end, streak_len
FROM ranked
WHERE rnk = 1;RANK oder ROW_NUMBER bei Gleichständen
Was ist, wenn ein Benutzer zwei Folgen mit gleicher maximaler Länge hat und der Interviewer beide zurückgeben möchte? Ersetzen Sie ROW_NUMBER durch RANK und behalten Sie rnk = 1.
ROW_NUMBER— genau ein Gewinner pro Benutzer (bei Gleichständen beliebig, sofern Sie keinen Tie-Breaker hinzufügen).RANK— alle gleich langen längsten Folgen teilen sich Rang 1 und bleiben erhalten.
Stellen Sie klar, welches Verhalten gewünscht ist; das zeigt, dass Sie Randfälle beachten.
RANK() OVER (
PARTITION BY user_id
ORDER BY streak_len DESC
) AS rnk -- keep all rnk = 1Durchgerechnetes Beispiel
Angenommen, Benutzer 7 meldet sich vom 1. bis 4. Januar, dann am 10. und 11. Januar und schließlich vom 20. bis 23. Januar an. Es gibt drei Inseln mit den Längen 4, 2 und 4. Die größte Länge beträgt 4, und es gibt einen Gleichstand.
- Mit
ROW_NUMBERund dem Tie-Breakerstreak_start: Es wird nur die Folge vom 1. bis 4. Januar zurückgegeben. - Mit
RANK: Es werden sowohl die Folge vom 1. bis 4. Januar als auch die vom 20. bis 23. Januar zurückgegeben.
Wenn Sie das laut aussprechen, zeigen Sie, dass Sie über Gleichstände nachgedacht haben.
Umgang mit Benutzern ohne Logins
Ein Interviewer könnte fragen: „Was ist mit Benutzern, die sich nie angemeldet haben?“ Für diese Benutzer gibt es keine Zeilen in logins, daher verschwinden sie aus dem Ergebnis. Wenn sie mit einer Streak von 0 erscheinen müssen, verwenden Sie einen LEFT JOIN der vollständigen Tabelle users und COALESCE.
SELECT u.user_id,
COALESCE(MAX(i.streak_len), 0) AS longest_streak
FROM users u
LEFT JOIN islands i ON i.user_id = u.user_id
GROUP BY u.user_id;Performance-Hinweise
Dieses Muster führt einen einzigen geordneten Durchlauf über die Daten sowie eine Gruppierung aus. Damit es schnell bleibt:
- Stellen Sie sicher, dass ein Index auf
(user_id, login_date)vorhanden ist, damit das Window-ORDER-BY keine Sortierung benötigt. - Deduplizieren Sie frühzeitig, wenn die Quelle mehrere Ereignisse pro Tag enthält.
- Vermeiden Sie es,
login_dateim ORDER BY mit Funktionen zu umschließen, da dies die Indexverwendung verhindern kann.
Bei sehr großen Tabellen ist dieses Verfahren deutlich schneller als jeder Self-Join-Ansatz.
Vollständige Interviewantwort
Hier ist die vollständige, ausformulierte Abfrage, die für jeden Benutzer die längste Streak einschließlich ihrer Datumsangaben zurückgibt — die Version, die Sie am Whiteboard aufschreiben sollten.
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
),
ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY streak_len DESC, streak_start
) AS rnk
FROM islands
)
SELECT user_id, streak_start, streak_end, streak_len
FROM ranked
WHERE rnk = 1
ORDER BY user_id;Kurzer Test
Wählen Sie das passende Werkzeug für die Anforderung.
Zusammenfassung
So berechnen Sie die längste Streak pro Benutzer:
- Bilden Sie Inseln mit dem Anker
login_date - ROW_NUMBER(). - Reduzieren Sie jede Insel auf ihre Länge und ihren Datumsbereich.
- Für die Länge allein verwenden Sie
MAX(streak_len), gruppiert nach Benutzer. - Für die Datumsangaben nummerieren Sie die Inseln pro Benutzer und behalten Rang 1 —
RANK, um Gleichstände einzuschließen, oderROW_NUMBERfür genau einen Gewinner. - Verwenden Sie einen LEFT JOIN von users, damit Benutzer mit einer Streak von 0 ebenfalls erscheinen.
Als Nächstes: Erkennen von N aufeinanderfolgenden Zeilen, die eine Bedingung erfüllen.
Häufig gestellte Fragen
Ist die Lektion „Längste Serie pro Benutzer“ kostenlos?
Ja — der vollständige Text von „Längste Serie pro Benutzer“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Längste Serie pro Benutzer“?
Berechnen Sie die maximale Länge aufeinanderfolgender Einträge innerhalb jeder Gruppe. Du übst Coding 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 Coding Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. Coding 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 2 von 4.
Wie lange dauert die Lektion „Längste Serie pro Benutzer“?
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 Coding Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede Coding 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
- Aufeinanderfolgende Kalendertage erkennen
- Längste Serie pro Benutzer
- N aufeinanderfolgende Zeilen mit erfüllter Bedingung
- Aktuelle aktive Serie bis heute