Voorbereiding op programmeerinterviews · Les

Huidige actieve reeks tot vandaag

Bereken een doorlopende reeks en zet deze na een onderbreking terug op nul.

Les 4 van 413 stappen

Huidige actieve reeks tot vandaag is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op programmeerinterviews. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.

De productvraag

Functies voor reeksen (denk aan Duolingo of Snapchat) hebben de huidige reeks nodig, niet de historisch langste. De interviewopgave luidt: "Hoeveel opeenvolgende dagen tot en met vandaag is elke gebruiker actief geweest? Zet de reeks terug op 0 als de gebruiker vandaag niet actief was."

Dit voegt een extra complicatie toe: de reeks moet aan vandaag zijn verankerd (of aan gisteren volgens een respijtregel). We bouwen dit op de basis van hiaten en eilanden die je al kent.

Actief definiëren

Bespreek eerst de regels met je interviewer — deze keuzes veranderen de query:

  • Vereist de reeks activiteit vandaag, of is gisteren acceptabel (respijtperiode)?
  • Worden meerdere gebeurtenissen per dag samengevoegd tot één dag?
  • Welke tijdzone bepaalt een "dag"?

We nemen aan dat er één rij per actieve dag is en dat de reeks actueel is als die vandaag OF gisteren bevat.

Eilanden opnieuw opbouwen

Gebruik het anker opnieuw: nummer de dagen van elke gebruiker op datum en trek dit nummer af. Elke opeenvolgende reeks heeft hetzelfde anker. De huidige reeks is eenvoudigweg het eiland waarvan de laatste dag vandaag of gisteren is.

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;

Het nieuwste eiland bepalen

Het meest recente eiland van elke gebruiker is het eiland met de grootste streak_end. We controleren of die einddatum recent genoeg is om als lopend te tellen.

CURRENT_DATE geeft vandaag. CURRENT_DATE - 1 is gisteren. Als streak_end gelijk is aan een van beide, is de reeks actief.

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;

De recentheidscontrole toepassen

Bepaal nu of het nieuwste eiland actief is. Als de einddatum vandaag of gisteren is, is de huidige reeks gelijk aan de lengte ervan; anders heeft de gebruiker de reeks onderbroken en is de huidige waarde 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;

De volledige query voor de huidige reeks

Voeg alle lagen samen: nummer de rijen, bouw eilanden, kies het nieuwste eiland per gebruiker en pas daarna de recency-CASE toe. Dit is het volledige antwoord.

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;

Striktheid: alleen vandaag

Als de bedrijfsregel strikt is — de reeks is alleen actief als de gebruiker vandaag actief was — wijzig je de vergelijking zodat streak_end = CURRENT_DATE vereist is.

De versie met respijtperiode (>= CURRENT_DATE - 1) is gebruiksvriendelijker en gebruikelijk in echte apps, waarin de dag nog niet voorbij is. Bevestig altijd welke versie de interviewer wil.

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

Alternatief: terugwerken

Een ander denkmodel dat sommige interviewers verkiezen: bereken het verschil tussen elke dag en vandaag. Een dag maakt alleen deel uit van de huidige reeks als elke dag vanaf die dag tot en met vandaag aanwezig is. Anders gezegd: vergelijk login_date met CURRENT_DATE - (offset from the latest).

De eilandmethode is meestal duidelijker, maar kennis van een alternatief toont diepgang. Het kernidee is hetzelfde: een ononderbroken keten die aan vandaag is verankerd.

Inactieve gebruikers opnemen

Gebruikers die ontbreken in logins hebben geen eiland en verdwijnen. Als elke gebruiker een reeks moet krijgen (waarschijnlijk 0), voeg dan de gebruikerslijst toe met een LEFT JOIN en zet het resultaat met COALESCE op 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;

Valkuilen met tijdzones

Als activiteit als tijdstempels is opgeslagen, hangt "vandaag" af van de tijdzone. Converteer de tijd voordat je die terugbrengt tot een datum.

  • Bewaar en vergelijk in UTC, of converteer eerst naar de lokale tijdzone van de gebruiker.
  • Gebruik event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tz in Postgres en cast het resultaat daarna naar een datum.
  • Een eenvoudige ::date op een UTC-tijdstempel kan een gebeurtenis in de avond op de verkeerde kalenderdag plaatsen.

Als je dit benoemt, voorkom je een klassieke vervolgvraag over een valkuil.

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

Prestaties en afronding

Voor dashboards die vaak worden vernieuwd, wordt deze query per gebruiker in één doorgang uitgevoerd. Houd het snel:

  • Maak een index op (user_id, login_date).
  • Beperk de invoer eventueel tot recente datums — een huidige reeks kan geen gegevens bevatten die ouder zijn dan de reeks zelf, dus een voortschrijdend venster van bijvoorbeeld de laatste 400 dagen is ruim voldoende.
  • Materialiseer dagelijkse gegevens in een reekstabel als het resultaat zeer vaak wordt gelezen.

Korte controle

Controleer of je het anker voor "nu" begrijpt.

Samenvatting

Zo bereken je de huidige actieve reeks tot en met vandaag:

  • Bouw eilanden met het anker login_date - ROW_NUMBER().
  • Selecteer het nieuwste eiland van elke gebruiker met de maximale waarde van streak_end.
  • Geef alleen de lengte terug als streak_end vandaag is (of gisteren bij een respijtperiode), en geef anders 0 terug.
  • Gebruik een LEFT JOIN op users voor inactieve accounts en verwerk tijdzones voordat je een tijdstip terugbrengt tot een datum.

Je beheerst nu de volledige gereedschapskist voor reeksanalyse: reeksen detecteren, de langste reeks vinden, voorwaarden met N opeenvolgende rijen controleren en de actieve reeks bepalen.

Gratis beginnen

Leer Voorbereiding op programmeerinterviews met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
90
Lessen
360

Veelgestelde vragen

Is de les “Huidige actieve reeks tot vandaag” gratis?

Ja — de volledige tekst van “Huidige actieve reeks tot vandaag” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op programmeerinterviews wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.

Wat leer ik in “Huidige actieve reeks tot vandaag”?

Bereken een doorlopende reeks en zet deze na een onderbreking terug op nul. Je oefent met Voorbereiding op programmeerinterviews door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Voorbereiding op programmeerinterviews te beginnen?

Ervaring vooraf is niet nodig. Voorbereiding op programmeerinterviews op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Huidige actieve reeks tot vandaag”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op programmeerinterviews?

Ja. Elke les over Voorbereiding op programmeerinterviews bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Opeenvolgende kalenderdagen detecteren
  2. Langste reeks per gebruiker
  3. N opeenvolgende rijen die aan een voorwaarde voldoen
  4. Huidige actieve reeks tot vandaag
← Terug naar Voorbereiding op programmeerinterviews