Huidige actieve reeks tot vandaag
Bereken een doorlopende reeks en zet deze na een onderbreking terug op nul.
Huidige actieve reeks tot vandaag is een gratis Voorbereiding op SQL-sollicitatiegesprekken-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 SQL-sollicitatiegesprekken. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op SQL-sollicitatiegesprekken 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_streakAlternatief: 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_tzin Postgres en cast het resultaat daarna naar een datum. - Een eenvoudige
::dateop 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_endvandaag 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.
Leer SQL 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
- 30
- Lessen
- 120
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 SQL-sollicitatiegesprekken wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op SQL-sollicitatiegesprekken 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 SQL-sollicitatiegesprekken 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 SQL-sollicitatiegesprekken te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op SQL-sollicitatiegesprekken 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 SQL-sollicitatiegesprekken?
Ja. Elke les over Voorbereiding op SQL-sollicitatiegesprekken 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
- Opeenvolgende kalenderdagen detecteren
- Langste reeks per gebruiker
- N opeenvolgende rijen die aan een voorwaarde voldoen
- Huidige actieve reeks tot vandaag