Frågor för churn och återaktivering
Identifiera användare som har lämnat och de som återkom efter ett uppehåll.
Frågor för churn och återaktivering är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Retentionens andra sida
Om retention mäter vilka som stannade kvar, mäter churn vilka som lämnade och återaktivering vilka som kom tillbaka. Intervjuare tar upp dessa tillsammans med retention eftersom de visar om ni kan resonera om frånvaro av aktivitet, vilket är svårare än att räkna förekomst.
Det återkommande tricket är att ni inte kan filtrera på rader som inte finns. Churn-frågor handlar i grunden om att hitta luckan mellan en användares senaste aktivitet och nu (eller mellan den senaste och nästa aktiviteten).
Definiera churn exakt
”Churnad” betyder ingenting utan ett tidsfönster. En vanlig definition är att en användare är churnad om hen inte har haft någon aktivitet under de senaste 30 dagarna. Tröskeln på 30 dagars inaktivitet är ett verksamhetsbeslut som ni måste fastställa.
För prenumerationsprodukter kan churn i stället betyda en uppsagd eller utgången prenumeration, alltså en statusändring snarare än ett aktivitetsglapp. Klargör vilken modell som gäller innan ni skriver SQL.
Senaste aktivitet per användare
Grunden för churn baserad på aktivitetsglapp är varje användares senaste händelse. Gruppera per användare och ta MAX av händelsedatumet.
Detta enda värde, jämfört med dagens datum, visar hur länge användaren har varit tyst. Allt som följer är en jämförelse med datumet då användaren senast sågs.
SELECT
user_id,
MAX(event_at::date) AS last_active
FROM events
GROUP BY user_id;Frågan som hittar churnade användare
En användare är churnad om den senaste aktiviteten inträffade för mer än 30 dagar sedan. Jämför last_active med CURRENT_DATE - 30. Alla vars senaste händelse ligger före den gränsen har blivit inaktiva.
Observera att arbetet sker efter aggregeringen: först reducerar ni till en rad per användare och testar sedan glappet. Om ni filtrerar råa händelser efter datum får ni bara veta vilka som var inaktiva under ett visst fönster, inte vilka som överlag är churnade.
WITH last_seen AS (
SELECT user_id, MAX(event_at::date) AS last_active
FROM events
GROUP BY user_id
)
SELECT user_id, last_active
FROM last_seen
WHERE last_active < CURRENT_DATE - INTERVAL '30 days';Beräkna churngrad
Churngraden är antalet churnade användare delat med den relevanta basen, ofta användare som var aktiva vid periodens början. Använd villkorad aggregering för att räkna churnade och totala användare i en genomläsning och dividera sedan omsorgsfullt med 100.0 och NULLIF.
Var tydlig med nämnaren i intervjun: churn bland alla användare historiskt och churn bland tidigare aktiva användare är olika mätvärden.
WITH last_seen AS (
SELECT user_id, MAX(event_at::date) AS last_active
FROM events GROUP BY user_id
)
SELECT
COUNT(*) FILTER (
WHERE last_active < CURRENT_DATE - INTERVAL '30 days'
) AS churned,
COUNT(*) AS total_users,
ROUND(100.0 * COUNT(*) FILTER (
WHERE last_active < CURRENT_DATE - INTERVAL '30 days')
/ NULLIF(COUNT(*), 0), 1) AS churn_pct
FROM last_seen;Periodöverskridande churn med mängdlogik
Ett annat sätt att formulera frågan är: vilka var aktiva förra månaden men inte den här månaden? Detta är en mängddifferens. Skapa mängden aktiva användare för förra månaden och mängden aktiva användare för den här månaden, och hitta sedan medlemmarna i den första mängden som inte finns i den andra.
Ni kan uttrycka det med EXCEPT, en LEFT JOIN / IS NULL-anti-join eller NOT EXISTS. Anti-join är mest portabel och den variant som intervjuare oftast vill se.
WITH last_month AS (
SELECT DISTINCT user_id FROM events
WHERE event_at >= DATE '2024-04-01' AND event_at < DATE '2024-05-01'
),
this_month AS (
SELECT DISTINCT user_id FROM events
WHERE event_at >= DATE '2024-05-01' AND event_at < DATE '2024-06-01'
)
SELECT user_id FROM last_month
EXCEPT
SELECT user_id FROM this_month;Anti-join-formen
Samma fråga om churn under den här perioden, uttryckt som en anti-join: gör en LEFT JOIN av den här månadens aktiva användare mot förra månadens och behåll sedan de rader där matchningen är NULL. Det här är användare som fanns förra månaden men saknas den här månaden – de som har churnat.
NOT EXISTS är ett lika bra svar och hanterar NULL-värden säkert. Nämn att NOT IN kan vara riskabelt om den inre mängden kan innehålla NULL-värden – en klassisk fallgrop.
SELECT lm.user_id
FROM last_month lm
LEFT JOIN this_month tm ON tm.user_id = lm.user_id
WHERE tm.user_id IS NULL;Definiera återaktivering
Återaktivering (även kallat reactivation) är när en användare som har churnat blir aktiv igen. Kännetecknet är en lucka i tidslinjen: aktiv, sedan en period av tystnad som är längre än churntröskeln, och därefter aktiv igen.
En återaktiverad användare den här månaden är alltså aktiv nu, var inaktiv under den senaste perioden men hade aktivitet under någon tidigare period. Det är motsatsen till churn.
Identifiera luckor med LAG
Det eleganta sättet att hitta återaktivering är LAG-fönsterfunktionen: för varje aktivitetsperiod och användare tittar ni på den föregående aktiva perioden. Om luckan mellan dem överskrider tröskeln är den här perioden en återaktivering.
LAG gör en self-join överflödig och ger en tydlig fråga. Partitionera efter användare, sortera efter den aktiva perioden och jämför varje period med föregångaren.
WITH monthly AS (
SELECT DISTINCT user_id,
DATE_TRUNC('month', event_at) AS active_month
FROM events
),
gaps AS (
SELECT user_id, active_month,
LAG(active_month) OVER (
PARTITION BY user_id ORDER BY active_month
) AS prev_month
FROM monthly
)
SELECT user_id, active_month AS resurrected_month
FROM gaps
WHERE prev_month IS NOT NULL
AND active_month > prev_month + INTERVAL '1 month';Nya kontra återaktiverade kontra kvarvarande
En fullständig fråga för aktivitetsklassificering märker varje aktiv användare den här perioden som en av följande: ny (ingen tidigare aktivitet), kvarvarande (även aktiv under den senaste perioden) eller återaktiverad (tidigare aktivitet men en lucka). Värdet prev_month från LAG styr alla tre.
prev_month IS NULL→ nyprev_month = active_month - 1→ kvarvarande- annars (en lucka) → återaktiverad
Att ta fram denna uppdelning är ett starkt och fullständigt svar.
SELECT user_id, active_month,
CASE
WHEN prev_month IS NULL THEN 'new'
WHEN active_month = prev_month + INTERVAL '1 month' THEN 'retained'
ELSE 'resurrected'
END AS user_state
FROM gaps;Fällan med NOT IN och NULL
En sista fallgrop. Om ni skriver churn som WHERE user_id NOT IN (SELECT user_id FROM this_month) och underfrågan returnerar ens ett enda NULL, blir hela resultatet tomt, eftersom NOT IN utvärderas som UNKNOWN vid jämförelse med NULL.
Föredra NOT EXISTS eller en LEFT JOIN / IS NULL-anti-join, som fungerar korrekt med NULL-värden. Att på eget initiativ påpeka denna skillnad är ett pålitligt senioritetstecken i retentionintervjuer.
-- safe anti-join instead of NOT IN
SELECT lm.user_id
FROM last_month lm
WHERE NOT EXISTS (
SELECT 1 FROM this_month tm
WHERE tm.user_id = lm.user_id
);Snabbkontroll
Ni vill hitta användare som var aktiva förra månaden men inte den här månaden. En kollega skrev WHERE user_id NOT IN (SELECT user_id FROM this_month), men frågan returnerar noll rader trots att vissa användare uppenbarligen har churnat. Vilken är den säkraste lösningen?
Sammanfattning: churn och återaktivering
Det viktigaste om churn och återaktivering:
- Definiera churn med en inaktivitetströskel (till exempel ingen aktivitet på 30 dagar) eller en ändring av prenumerationsstatus – förtydliga vilket.
- Beräkna varje användares MAX(last activity) och jämför sedan med
CURRENT_DATE - threshold. - Churn från en period till nästa är en mängdskillnad: använd EXCEPT, NOT EXISTS eller en LEFT JOIN / IS NULL-anti-join.
- Återaktivering är en lucka i tidslinjen; identifiera den med
LAGför att klassificera användare som nya, kvarvarande eller återaktiverade. - Undvik
NOT INnär NULL-värden kan förekomma – resultatet blir annars tyst tomt.
Lär dig Förberedelse inför kodningsintervjuer med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 90
- Lektioner
- 360
Vanliga frågor
Är lektionen ”Frågor för churn och återaktivering” gratis?
Ja – hela texten till ”Frågor för churn och återaktivering” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Vad lär jag mig i ”Frågor för churn och återaktivering”?
Identifiera användare som har lämnat och de som återkom efter ett uppehåll. Ni övar på Förberedelse inför kodningsintervjuer med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelse inför kodningsintervjuer?
Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Frågor för churn och återaktivering”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelse inför kodningsintervjuer-lektionen?
Ja. Varje Förberedelse inför kodningsintervjuer-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Definiera en kohort utifrån den första åtgärden
- Bygga en retentionmatris
- Retention dag N och rullande retention
- Frågor för churn och återaktivering