Forberedelse til kodeinterviews · Lektion

Definition af en kohorte ud fra den første handling

Tildeling af en kohorte til hver bruger baseret på datoen for den første hændelse.

Lektion 1 af 413 trin

Definition af en kohorte ud fra den første handling er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvorfor kohorter dukker op i interviews

Når en interviewer inden for produktanalyse siger "opret en kohorte", tester vedkommende, om du kan tildele hver bruger til en gruppe baseret på hvornår brugeren gjorde noget for første gang og derefter følge gruppen over tid.

En kohorte er et sæt brugere, der deler en starthændelse i den samme periode, normalt deres første køb, tilmelding eller login. Fordelen ved kohorter er, at de lader dig sammenligne brugere på lige vilkår: Alle i januarkohorten måles fra deres egen start i januar.

Den første underfærdighed, og den som denne lektion træner, er at beregne hver brugers dato for første handling pålideligt.

Kildetabellen

Næsten alle spørgsmål om kohorter begynder med en hændelsestabel: én række pr. brugerhandling med et tidsstempel. Forestil dig en events-tabel:

  • user_id — hvem der handlede
  • event_type — hvad brugeren gjorde
  • event_at — hvornår det skete, som et tidsstempel

Afklar datagranulariteten højt i et interview: "Er der én række pr. hændelse, og kan en bruger optræde mange gange?" Svaret er næsten altid ja, og netop derfor skal du aggregere for at samle data til én første handling pr. bruger.

CREATE TABLE events (
  user_id    INT,
  event_type VARCHAR(50),
  event_at   TIMESTAMP
);

Første handling = MIN af tidsstemplet

Det centrale trin er enkelt: Gruppér efter user_id, og brug MIN(event_at). Denne minimumsværdi er brugerens første handling, altså det tidspunkt der placerer brugeren i en kohorte.

Det er det svar, interviewere først vil høre, før du begynder på avancerede vinduesfunktioner. En almindelig GROUP BY er korrekt, let at læse og hurtig.

SELECT
  user_id,
  MIN(event_at) AS first_action_at
FROM events
GROUP BY user_id;

Filtrering til en afgørende hændelse

Ofte defineres kohorten af en bestemt handling og ikke af en vilkårlig hændelse. "Inddel brugere efter deres første køb" betyder, at du skal filtrere til købsrækker før du finder minimumsværdien.

Placér filteret i WHERE, så MIN kun ser kvalificerende rækker. En typisk interviewfælde er at finde MIN over alle hændelser og derefter filtrere, hvilket ville give en forkert startdato til alle, der kiggede rundt, før de købte.

SELECT
  user_id,
  MIN(event_at) AS first_purchase_at
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

Inddeling i en kohorteperiode

En kohorte er normalt en periode og ikke et nøjagtigt tidsstempel: for eksempel "kohorten fra 2024-03" eller "ugen fra 2024-03-04". Afkort datoen for den første handling til periodens granularitet.

I Postgres skal du bruge DATE_TRUNC('month', ...). I MySQL kan du bruge DATE_FORMAT(d, '%Y-%m-01'); i SQL Server DATETRUNC(month, d) eller en beregnet første dag i måneden. Nævn din SQL-dialekt i interviewet, så valget af syntaks virker bevidst.

SELECT
  user_id,
  DATE_TRUNC('month', MIN(event_at)) AS cohort_month
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

Saml det i en CTE

Tildelingen af en kohorte pr. bruger er en byggeblok, som du vil genbruge i forespørgsler om fastholdelse, så pak den ind i en CTE med et tydeligt navn. Det gør de næste trin lettere at læse og viser intervieweren, at du tænker i sammensættelige dele.

Herfra kan alle efterfølgende forespørgsler forbinde tilbage til user_cohort for at vide, hvilken gruppe en bruger tilhører.

WITH user_cohort AS (
  SELECT
    user_id,
    DATE_TRUNC('month', MIN(event_at)) AS cohort_month
  FROM events
  WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT * FROM user_cohort;

Kohortestørrelse: Optæl medlemmer

Det første plausibilitetstjek, en interviewer forventer, er kohortestørrelsen: hvor mange brugere tilhører hver kohorte. Gruppér CTE'en med tildelingen efter cohort_month, og optæl unikke brugere.

Brug for en sikkerheds skyld COUNT(DISTINCT user_id), selv om CTE'en allerede har én række pr. bruger; det viser, at du tænker over datagranulariteten. Denne optælling bliver nævneren for alle senere fastholdelsesprocenter.

WITH user_cohort AS (
  SELECT user_id, DATE_TRUNC('month', MIN(event_at)) AS cohort_month
  FROM events WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT
  cohort_month,
  COUNT(DISTINCT user_id) AS cohort_size
FROM user_cohort
GROUP BY cohort_month
ORDER BY cohort_month;

Alternativ med en vinduesfunktion

Interviewere beder nogle gange om at få kohortemærkatet knyttet til hver hændelsesrække i stedet for en sammenfoldet tabel. Her er en vinduesfunktion velegnet: MIN(event_at) OVER (PARTITION BY user_id) beregner den første handling uden at fjerne rækker.

Det er praktisk, når du skal bruge både de detaljerede hændelser og kohortemærkatet i ét gennemløb, hvilket er grundlaget for at tælle fastholdelse.

SELECT
  user_id,
  event_at,
  DATE_TRUNC('month',
    MIN(event_at) OVER (PARTITION BY user_id)
  ) AS cohort_month
FROM events
WHERE event_type = 'purchase';

Faldgruben med ens værdier og dubletter

Hvad nu hvis en bruger har to hændelser på præcis det samme tidligste tidspunkt? MIN håndterer det problemfrit: Den returnerer den ene minimumsværdi, uanset hvor mange rækker der har samme værdi, så kohortetildelingen fortsat bliver én pr. bruger.

Sammenlign det med en tilgang baseret på ROW_NUMBER() ... ORDER BY event_at, hvor ens værdier brydes vilkårligt, og du skal tilføje en deterministisk tie-breaker (for eksempel event_id) for at få et stabilt resultat. Hvis du nævner denne afvejning uden at blive bedt om det, virker du erfaren.

SELECT user_id, event_at,
  ROW_NUMBER() OVER (
    PARTITION BY user_id
    ORDER BY event_at, event_id
  ) AS rn
FROM events
WHERE event_type = 'purchase';

Tidszoner og døgnskellet

Et subtilt interviewspørgsmål: Et køb kl. 23.30 i New York ligger på den næste dag i UTC. Hvis kohorter inddeles efter kalenderdag, afgør tidszonen, hvilken kohorte brugeren havner i.

Det sikre svar er: Gem tidsstempler i UTC, og konvertér dem derefter til virksomhedens tidszone, før du afkorter. Sig tydeligt, hvilken tidszone der definerer "dag" for målingen, fordi denne ene beslutning kan flytte tusindvis af brugere mellem kohorter.

SELECT
  user_id,
  DATE_TRUNC('day',
    MIN(event_at AT TIME ZONE 'America/New_York')
  ) AS cohort_day
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

Udeluk brugere før analyseperioden

Reelle analyser afgrænser kohorten til et datointerval, for eksempel "kohorter, der startede i Q1". Filtrér på den aggregerede dato for den første handling, hvilket betyder en HAVING-klausul eller et ydre filter på CTE'en, ikke et WHERE-filter på rå hændelser.

Hvis du filtrerer rå hændelser efter dato, vil en bruger, der købte for første gang i december, men også var aktiv i Q1, fejlagtigt kunne ende i en Q1-kohorte. Afgræns altid efter den beregnede første handling.

WITH user_cohort AS (
  SELECT user_id, MIN(event_at) AS first_at
  FROM events WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT user_id, DATE_TRUNC('month', first_at) AS cohort_month
FROM user_cohort
WHERE first_at >= DATE '2024-01-01'
  AND first_at <  DATE '2024-04-01';

Hurtigt tjek

En interviewer spørger: "Inddel hver bruger efter måneden for det første køb. Brugere kan have kigget rundt, før de køber." Hvilken tilgang er korrekt?

Opsummering: Definér en kohorte

De vigtigste pointer til interviewspørgsmålet om definition af en kohorte:

  • En kohorte grupperer brugere efter deres første kvalificerende handling.
  • Beregn den med MIN(event_at) efter at have filtreret til den afgørende hændelse i WHERE.
  • Inddel i en periode med DATE_TRUNC eller den tilsvarende funktion i din SQL-dialekt.
  • Saml tildelingen i en CTE, så den kan genbruges; COUNT(DISTINCT user_id) giver kohortestørrelsen.
  • Vær opmærksom på døgnskellet i tidszonen, og afgræns datointervaller efter den beregnede første handling, aldrig efter rå hændelser.

Få styr på dette, så bliver fastholdelsesmatricen i næste lektion blot en sammenføjning.

Gratis at komme i gang

Lær Forberedelse til kodeinterviews med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
90
Lektioner
360

Ofte stillede spørgsmål

Er lektionen “Definition af en kohorte ud fra den første handling” gratis?

Ja — hele teksten til “Definition af en kohorte ud fra den første handling” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Definition af en kohorte ud fra den første handling”?

Tildeling af en kohorte til hver bruger baseret på datoen for den første hændelse. Du øver dig i Forberedelse til kodeinterviews med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Forberedelse til kodeinterviews?

Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Definition af en kohorte ud fra den første handling”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Forberedelse til kodeinterviews-lektion?

Ja. Alle Forberedelse til kodeinterviews-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Definition af en kohorte ud fra den første handling
  2. Opbygning af en fastholdelsesmatrix
  3. Dag-N- og rullende fastholdelse
  4. Forespørgsler om kundefrafald og tilbagevenden
← Tilbage til Forberedelse til kodeinterviews