Voorbereiding op programmeerinterviews · Les

Geordende gebeurtenissen en tijdvensters

Zorg met windowfuncties dat stappen in de juiste volgorde en binnen een tijdslimiet plaatsvinden.

Les 2 van 413 stappen

Geordende gebeurtenissen en tijdvensters is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 2 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.

Waarom volgorde en tijd belangrijk zijn

De basisfunnel uit de vorige les controleert alleen of een gebruiker elke stap heeft uitgevoerd. Een scherpere interviewer vraagt: vonden de stappen plaats in de juiste volgorde en binnen een redelijke tijd?

Een gebruiker die maandag iets heeft gekocht en vrijdag de marketingpagina heeft bezocht, is niet via jouw funnel geconverteerd. Volgorde en timing maken van een naïeve funnel met vlaggen een geloofwaardige funnel.

Het idee van het eerste tijdstip per gebruiker

Leg om de volgorde te bepalen het eerste tijdstip vast waarop elke gebruiker elke stap heeft uitgevoerd: het eerste bezoek, de eerste aanmelding en de eerste aankoop.

Een geldige conversie betekent vervolgens dat first_signup_time >= first_visit_time en zo verder in de keten. Met MIN(event_time), gegroepeerd per stap, krijg je deze ankerpunten.

SELECT
  user_id,
  MIN(CASE WHEN event_name = 'visit'    THEN event_time END) AS first_visit,
  MIN(CASE WHEN event_name = 'signup'   THEN event_time END) AS first_signup,
  MIN(CASE WHEN event_name = 'purchase' THEN event_time END) AS first_purchase
FROM events
GROUP BY user_id;

Stappen in de juiste volgorde vereisen

Met de eerste tijdstempels per stap wordt het afdwingen van de volgorde een vergelijking. Een gebruiker is echt naar stap 3 geconverteerd als elke tijdstempel niet-NULL is en de reeks monotoon oploopt.

Let erop dat een NULL-tijdstempel (de stap heeft nooit plaatsgevonden) vanzelf niet aan de vergelijking voldoet. Dat is precies wat je wilt.

WITH t AS (
  SELECT user_id,
    MIN(CASE WHEN event_name='visit'    THEN event_time END) AS visit_t,
    MIN(CASE WHEN event_name='signup'   THEN event_time END) AS signup_t,
    MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
  FROM events GROUP BY user_id
)
SELECT COUNT(*) AS converted_in_order
FROM t
WHERE visit_t IS NOT NULL
  AND signup_t  >= visit_t
  AND purchase_t >= signup_t;

Een tijdvenster toevoegen

De meeste funnels hebben een deadline: "binnen 7 dagen na het eerste bezoek converteren". Voeg een bovengrens voor het interval toe tussen de eerste stap en de laatste stap.

Rekenen met datums verschilt per dialect. In Postgres schrijf je visit_t + INTERVAL '7 days'; in MySQL gebruik je DATE_ADD(visit_t, INTERVAL 7 DAY). Noem altijd je SQL-dialect.

WITH t AS (
  SELECT user_id,
    MIN(CASE WHEN event_name='visit'    THEN event_time END) AS visit_t,
    MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
  FROM events GROUP BY user_id
)
SELECT COUNT(*) AS purchased_within_7d
FROM t
WHERE purchase_t >= visit_t
  AND purchase_t <  visit_t + INTERVAL '7 days';

Waarom het eerste tijdstip en niet zomaar een tijdstip

Een subtiel punt tijdens een sollicitatiegesprek: moet het tijdvenster lopen vanaf het eerste bezoek van de gebruiker of vanaf het meest recente bezoek vóór de aanmelding? Dat hangt af van de productvraag.

  • Vensters op basis van eerste contact meten hoe lang het duurt van de eerste interesse tot de conversie.
  • Vensters op basis van laatste contact meten de conversiesnelheid na het laatste bezoek.

Vraag de interviewer welke betekenis bedoeld wordt. Bewust kiezen laat zien dat je ervaren bent.

Geordende gebeurtenissen met LEAD

Bij complexe paden met meerdere stappen komen vensterfuncties goed van pas. Sorteer de gebeurtenissen van elke gebruiker op tijd en gebruik vervolgens LEAD om naar de volgende gebeurtenis te kijken en te controleren of dit de verwachte volgende stap is.

Dit werkt ook voor paden waarin de stappen worden afgewisseld met niet-gerelateerde gebeurtenissen.

SELECT
  user_id,
  event_name,
  event_time,
  LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event,
  LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events;

De volgende verwachte stap matchen

Bouw voort op LEAD: houd de rijen over waarin 'visit' direct wordt gevolgd door 'signup'. Zo vind je echte opeenvolgende overgangen, niet alleen gebeurtenissen die beide voorkomen.

Je kunt deze overgangscontroles aan elkaar koppelen om een volledig geordend pad stap voor stap te valideren.

WITH seq AS (
  SELECT user_id, event_name, event_time,
    LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event
  FROM events
)
SELECT COUNT(DISTINCT user_id) AS visit_then_signup
FROM seq
WHERE event_name = 'visit' AND next_event = 'signup';

Tijd tussen opeenvolgende stappen

Interviewers vragen graag: "Hoe lang duurt elke stap?" Gebruik LEAD op de tijdstempel en trek de waarden van elkaar af. Het verschil tussen opeenvolgende gebeurtenissen is de verblijfsduur in die fase.

Bereken per overgang de mediaan of het gemiddelde om de traagste fase van je funnel te vinden.

WITH seq AS (
  SELECT user_id, event_name, event_time,
    LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
  FROM events
)
SELECT
  event_name,
  AVG(EXTRACT(EPOCH FROM (next_time - event_time)) / 3600.0) AS avg_hours_to_next
FROM seq
WHERE next_time IS NOT NULL
GROUP BY event_name;

De randzaak van gelijke tijdstempels

Wat gebeurt er als twee gebeurtenissen exact dezelfde event_time hebben? Dan is signup_t >= visit_t waar, zelfs als ze gelijktijdig zijn uitgevoerd, en is de volgorde op basis van alleen de tijd niet eenduidig.

  • Gebruik >= of > bewust en leg uit waarom.
  • Voeg een tie-breaker toe, bijvoorbeeld een volgnummer van de gebeurtenis, aan ORDER BY zodat vensterfuncties deterministisch zijn.

Dit uit eigen beweging benoemen maakt indruk op interviewers.

SELECT user_id, event_name,
  ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_time, event_id) AS step_seq
FROM events;

Volgorde en tijdvenster combineren in één query

Dit is de volledige funnel met de juiste volgorde en binnen het tijdvenster. De funnel gebruikt het eerste bezoek als anker, vereist dat de eerste keer dat elke latere stap voorkomt na de vorige stap ligt en beperkt het volledige pad tot 7 dagen.

Dit antwoord onderscheidt een kandidaat die funnels begrijpt van iemand die alleen vlaggen telt.

WITH t AS (
  SELECT user_id,
    MIN(CASE WHEN event_name='visit'    THEN event_time END) AS v,
    MIN(CASE WHEN event_name='signup'   THEN event_time END) AS s,
    MIN(CASE WHEN event_name='purchase' THEN event_time END) AS p
  FROM events GROUP BY user_id
)
SELECT
  COUNT(*) FILTER (WHERE v IS NOT NULL)                                   AS visited,
  COUNT(*) FILTER (WHERE s >= v AND s < v + INTERVAL '7 days')            AS signed_up,
  COUNT(*) FILTER (WHERE s >= v AND p >= s AND p < v + INTERVAL '7 days') AS purchased
FROM t;

Opmerkingen over verschillende SQL-dialecten

Twee aandachtspunten voor overdraagbaarheid tijdens livecoderen:

  • FILTER (WHERE ...) op aggregaties is standaard-SQL en werkt in Postgres; gebruik in MySQL of oudere systemen SUM(CASE WHEN ... THEN 1 ELSE 0 END) als alternatief.
  • De syntaxis voor intervallen verschilt: Postgres + INTERVAL '7 days', MySQL DATE_ADD(d, INTERVAL 7 DAY), SQL Server DATEADD(day, 7, d).

Noem je aanname; de interviewer vindt het meestal niet belangrijk welk dialect je gebruikt, zolang je maar weet dat ze verschillen.

Snelle controle

Je moet gebruikers tellen die bezoek -> registratie -> aankoop in die volgorde hebben voltooid, binnen 7 dagen na het eerste bezoek. Welke aanpak is correct?

Samenvatting: Gebeurtenissen in volgorde en tijdvensters

Belangrijkste punten:

  • Leg voor elke gebruiker de eerste tijdstempel per stap vast met MIN(CASE ...).
  • Dwing de volgorde af door te eisen dat de tijd van elke stap op of na die van de vorige stap ligt.
  • Beperk het pad met een interval en vermeld de syntaxis van jouw dialect.
  • Gebruik LEAD/LAG voor controles van overgangen en de verblijfsduur tussen stappen.
  • Verwerk gelijke tijdstempels met een tweede sorteervoorwaarde in ORDER BY.

Volgende: van trechters naar experimenten en het berekenen van metrische waarden per variant.

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 “Geordende gebeurtenissen en tijdvensters” gratis?

Ja — de volledige tekst van “Geordende gebeurtenissen en tijdvensters” 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 “Geordende gebeurtenissen en tijdvensters”?

Zorg met windowfuncties dat stappen in de juiste volgorde en binnen een tijdslimiet plaatsvinden. 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 2 van 4.

Hoe lang duurt de les “Geordende gebeurtenissen en tijdvensters”?

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. Een funnel met meerdere stappen maken
  2. Geordende gebeurtenissen en tijdvensters
  3. Toewijzing aan A/B-tests en statistieken
  4. Lift, significantie en controles in SQL
← Terug naar Voorbereiding op programmeerinterviews