Retention dag N och rullande retention
Skillnaden mellan klassiska, rullande och avgränsade definitioner av retention.
Retention dag N och rullande retention är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 3 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örberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Varför retention har flera definitioner
En intervjuare säger sällan bara ”beräkna retention”. Den skarpa följdfrågan är: vilken retention? Samma data ger mycket olika siffror beroende på definitionen.
De tre ni måste känna till är Day-N (klassisk) retention, rullande (obegränsad) retention och retention i ett begränsat tidsfönster. Att känna till skillnaden och fråga vilken variant verksamheten vill ha är själva färdigheten som testas.
Day-N-retention (klassisk)
Day-N-retention ställer frågan: var användaren aktiv exakt dag N efter sin första aktivitet? Day-1, Day-7 och Day-30 är de klassiska mätvärdena för mobilappar.
Nyckelordet är exakt. En användare som var aktiv dag 6 och dag 8, men inte dag 7, räknas inte som kvarvarande på Day-7 enligt den klassiska definitionen. Denna precision gör antalet strikt och kurvan hackig.
Beräkna dagsskillnaden
Day-N-retention bygger på antalet dagar mellan kohortens start och varje aktivitetsdag. I Postgres ger subtraktion av två datum direkt ett heltal som anger antalet dagar.
Andra dialekter: DATEDIFF(day, start, d) i SQL Server och DATEDIFF(d, start) i MySQL. Ange vilken dialekt ni använder; konceptet (en dagsoffset) är detsamma.
WITH cohort AS (
SELECT user_id, MIN(event_at::date) AS day0
FROM events GROUP BY user_id
),
act AS (
SELECT DISTINCT user_id, event_at::date AS day
FROM events
)
SELECT c.user_id, (a.day - c.day0) AS day_n
FROM cohort c
JOIN act a ON a.user_id = c.user_id;En fråga för Day-7-retention
För att få retentionstalet för Day-7 räknar du distinkta användare vars dagsoffset är lika med 7 och dividerar med kohortens storlek. Använd villkorad aggregering så att både täljare och nämnare kommer från en enda genomläsning.
Likheten = 7 (inte >= 7) är kännetecknet för klassisk retention. Om du byter till en olikhet ändrar du definitionen i tysthet.
WITH dn AS (
SELECT c.user_id, (a.day - c.day0) AS day_n
FROM cohort c JOIN act a ON a.user_id = c.user_id
)
SELECT
COUNT(DISTINCT CASE WHEN day_n = 7 THEN user_id END) AS d7_retained,
COUNT(DISTINCT user_id) AS cohort_size,
ROUND(100.0 * COUNT(DISTINCT CASE WHEN day_n = 7 THEN user_id END)
/ NULLIF(COUNT(DISTINCT user_id), 0), 1) AS d7_pct
FROM dn;Rullande (obegränsad) retention
Rullande retention vid dag N ställer en mildare fråga: var användaren aktiv dag N eller någon senare dag? En användare räknas som kvarvarande på dag 7 om hen återkom dag 7, dag 20 eller någon gång senare.
Det ger en jämnare och högre kurva och föredras ofta när man mäter långsiktig benägenhet att fortsätta använda produkten. Den avgörande förändringen är att gå från = N till >= N för den senaste aktivitetsdagen.
Rullande retention med MAX för dag
Det tydligaste sättet att beräkna rullande retention är att hitta varje användares senaste aktiva dagsoffset (MAX). En användare räknas sedan som kvarvarande enligt rullande retention vid dag N om detta maxvärde är >= N.
Efter MAX har varje användare en rad, så det blir enkelt att räkna. Det gör också den rullande retentionens monotona egenskap tydlig: om du räknas som kvarvarande dag 30, räknas du som kvarvarande vid alla mindre N.
WITH last_day AS (
SELECT c.user_id, MAX(a.day - c.day0) AS max_day_n
FROM cohort c JOIN act a ON a.user_id = c.user_id
GROUP BY c.user_id
)
SELECT
COUNT(*) AS cohort_size,
COUNT(*) FILTER (WHERE max_day_n >= 7) AS rolling_d7,
ROUND(100.0 * COUNT(*) FILTER (WHERE max_day_n >= 7)
/ NULLIF(COUNT(*), 0), 1) AS rolling_d7_pct
FROM last_day;Retention i ett begränsat tidsfönster
Mellanalternativet är begränsad retention: användaren har varit aktiv minst en gång inom ett tidsfönster runt dag N, till exempel dag 5 till 9 för ett ”vecka 1”-mätvärde. Det tillåter användare som inte var aktiva exakt den dagen, men jämnar ut mindre än helt rullande retention.
Detta är den mest realistiska definitionen ur verksamhetens perspektiv eftersom verklig användning sker i intensiva perioder. Frågan använder BETWEEN för dagsoffset.
SELECT
COUNT(DISTINCT CASE WHEN day_n BETWEEN 5 AND 9
THEN user_id END) AS week1_retained,
COUNT(DISTINCT user_id) AS cohort_size
FROM dn;Tre definitioner, samma användare
Gör skillnaden konkret. En användare börjar dag 0 och är sedan bara aktiv dag 9.
- Klassisk Day-7: räknas inte som kvarvarande (ingen aktivitet exakt dag 7).
- Rullande Day-7: räknas som kvarvarande (maxdag 9 >= 7).
- Begränsat 5–9-fönster för vecka 1: räknas som kvarvarande (dag 9 infaller i fönstret).
Samma data, tre svar. I en intervju kan ni beskriva ett exempel på det här sättet för att visa att ni förstår semantiken, inte bara syntaxen.
Periodens granularitet: dag, vecka eller månad
”Day-N” generaliseras till period-N. För en B2B-produkt med månatlig användning är retention på dagsnivå brus; då grupperar ni per månad och frågar om månad N. Mekaniken är identisk, det är bara granulariteten för trunkeringen som ändras.
Välj den granularitet som matchar produktens naturliga användningsrytm och säg det tydligt. Dagligen för konsumentinriktade mobilappar, veckovis eller månadsvis för långsammare B2B-verktyg.
-- weekly grain: offset in whole weeks
SELECT
c.user_id,
FLOOR((a.day - c.day0) / 7) AS week_n
FROM cohort c
JOIN act a ON a.user_id = c.user_id;Fällan med överlevnad och mognad
En subtil fråga på seniornivå: rapportera inte Day-30-retention för en kohort som bara är 10 dagar gammal. Den har ännu inte haft möjlighet att vara aktiv dag 30, så värdet blir artificiellt 0 och visar inte verkligt låg retention.
Skydda er genom att bara ta med kohorter vars ålder är >= N när ni rapporterar Day-N. Filtrera på CURRENT_DATE - day0 >= N. Om ni glömmer detta ser de nyaste kohorterna katastrofalt dåliga ut.
WITH cohort AS (
SELECT user_id, MIN(event_at::date) AS day0
FROM events GROUP BY user_id
)
SELECT *
FROM cohort
WHERE (CURRENT_DATE - day0) >= 30; -- mature enough for Day-30Välj definition högt
Det bästa intervjusvaret är inte en fråga utan en motfråga: ”Vill ni ha klassisk Day-N, rullande retention eller ett begränsat tidsfönster? Och vilken period är naturlig?”
Beskriv sedan avvägningen: klassisk retention är strikt och bra för produktaktivering på en exakt dag; rullande retention överskattar kortsiktig retention men fångar långsiktig benägenhet att fortsätta använda produkten; begränsad retention är den realistiska kompromissen. Poängen med lektionen är att visa att ni väljer mätvärde med avsikt.
Snabbkontroll
En användares första aktivitet är dag 0 och den enda andra aktiviteten sker dag 12. Räknas användaren som kvarvarande på Day-7 enligt de olika definitionerna?
Sammanfattning: Retentiondefinitioner
Viktiga slutsatser om Day-N och rullande retention:
- Klassisk Day-N: aktiv exakt dag N (offset
= N) — strikt, hackig kurva. - Rullande: aktiv dag N eller senare (
MAX offset >= N) — jämnare, monoton och mäter benägenheten att fortsätta använda produkten. - Begränsad: aktiv inom ett tidsfönster (
BETWEEN) — den realistiska kompromissen. - Generalisera dag till valfri periodgranularitet som matchar produktens användningsrytm.
- Rapportera Day-N endast för mogna kohorter (ålder >= N) för att undvika överlevnadsfällan, och fråga alltid vilken definition verksamheten avser.
Lär dig SQL 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
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Retention dag N och rullande retention” gratis?
Ja – hela texten till ”Retention dag N och rullande retention” 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örberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”Retention dag N och rullande retention”?
Skillnaden mellan klassiska, rullande och avgränsade definitioner av retention. Ni övar på Förberedelser inför SQL-intervjun 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örberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun 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 3 av 4.
Hur lång tid tar lektionen ”Retention dag N och rullande retention”?
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örberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-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