Retenção no dia N e retenção contínua
A diferença entre as definições clássica, contínua e limitada de retenção.
Retenção no dia N e retenção contínua é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
Por Que a Retenção Tem Várias Definições
Um entrevistador raramente dirá apenas "calcule a retenção". A pergunta complementar precisa é: qual retenção? Os mesmos dados produzem números muito diferentes dependendo da definição.
As três que você precisa conhecer são: retenção do Dia-N (clássica), retenção contínua (sem limite) e retenção em janela limitada. Conhecer a diferença e perguntar qual delas a empresa deseja é justamente a habilidade que está sendo avaliada.
Retenção do Dia-N (Clássica)
A retenção do Dia-N pergunta: o usuário esteve ativo exatamente no dia N após sua primeira ação? Dia-1, Dia-7 e Dia-30 são as métricas clássicas de aplicativos móveis.
A palavra-chave é exatamente. Um usuário ativo no dia 6 e no dia 8, mas não no dia 7, não é retido no Dia-7 segundo a definição clássica. Essa precisão torna a contagem rigorosa e a curva irregular.
Calculando a Diferença em Dias
A retenção do Dia-N depende do número de dias entre o início da coorte e cada dia de atividade. No PostgreSQL, subtrair duas datas produz diretamente uma contagem inteira de dias.
Outros dialetos: DATEDIFF(day, start, d) no SQL Server e DATEDIFF(d, start) no MySQL. Informe o dialeto; o conceito, um deslocamento em dias, é idêntico.
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;Uma Consulta de Retenção do Dia-7
Para obter a taxa de retenção do Dia-7, conte os usuários distintos cujo deslocamento em dias é igual a 7 e divida pelo tamanho da coorte. Use agregação condicional para que tanto o numerador quanto o denominador venham de uma única leitura.
A igualdade = 7 (e não >= 7) é a característica da retenção clássica. Trocar por uma desigualdade altera silenciosamente a definição.
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;Retenção Contínua (Sem Limite)
A retenção contínua no dia N faz uma pergunta mais flexível: o usuário esteve ativo no dia N ou em qualquer dia posterior? Ela considera um usuário retido no dia 7 se ele retornou no dia 7, no dia 20 ou em qualquer momento posterior.
Isso produz uma curva mais suave e mais alta, sendo frequentemente preferido para medir a fidelidade de longo prazo. A mudança característica é passar de = N para >= N no último dia de atividade.
Retenção Contínua com o Dia MAX
A maneira mais clara de calcular a retenção contínua é encontrar o último deslocamento de dia em que cada usuário esteve ativo (MAX); depois, um usuário será retido pela regra contínua no dia N se esse máximo for >= N.
Após o MAX, cada usuário corresponde a uma única linha, portanto a contagem é simples. Isso também deixa claro que a retenção contínua é monotônica: se você está retido no dia 30, está retido em todos os N menores.
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;Retenção em Janela Limitada
O meio-termo é a retenção em janela limitada: estar ativo pelo menos uma vez dentro de uma janela em torno do dia N, por exemplo, nos dias 5 a 9 para uma métrica da "semana 1". Ela tolera usuários que não estão ativos no dia exato, mas suaviza menos do que a retenção totalmente contínua.
Essa é a definição mais realista para a empresa, pois o uso real ocorre em rajadas. A consulta usa um BETWEEN no deslocamento em dias.
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;Três Definições, o Mesmo Usuário
Concretize a diferença. Um usuário começa no dia 0 e depois fica ativo somente no dia 9.
- Dia-7 clássico: NÃO retido (não houve atividade exatamente no dia 7).
- Dia-7 contínuo: retido (o dia máximo é 9 >= 7).
- Semana 1 limitada, de 5 a 9: retido (o dia 9 está dentro da janela).
Os mesmos dados, três respostas. Em uma entrevista, descreva um exemplo assim para provar que entende a semântica, e não apenas a sintaxe.
Granularidade do Período: Dia, Semana ou Mês
"Dia-N" se generaliza para período-N. Para um produto B2B com uso mensal, a retenção diária é ruído; você agruparia por mês e faria perguntas sobre o mês-N. A mecânica é idêntica; somente a granularidade do truncamento muda.
Escolha a granularidade que corresponda à cadência natural de uso do produto e diga isso explicitamente. Diária para aplicativos móveis voltados ao consumidor, semanal ou mensal para ferramentas B2B mais lentas.
-- 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;A Armadilha da Sobrevivência e da Maturidade
Uma avaliação sutil para profissionais experientes: não informe a retenção do Dia-30 para uma coorte que tem apenas 10 dias. Ela ainda não teve a oportunidade de estar ativa no dia 30; portanto, seu valor é artificialmente 0, e não uma retenção realmente baixa.
Proteja-se incluindo somente coortes cuja idade >= N ao informar o Dia-N. Filtre usando CURRENT_DATE - day0 >= N. Esquecer isso faz as coortes recentes parecerem desastrosamente ruins.
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-30Escolhendo uma Definição em Voz Alta
A melhor resposta em uma entrevista não é uma consulta, mas uma pergunta de volta: "Você quer o Dia-N clássico, a retenção contínua ou uma janela limitada? E qual é o período natural?"
Depois, declare a compensação: a definição clássica é rigorosa e adequada para pontos de contato exatos do produto; a contínua superestima o curto prazo, mas captura a fidelidade ao longo do ciclo de vida; a limitada é o compromisso realista. Demonstrar que você escolhe a métrica intencionalmente é o objetivo principal da lição.
Verificação Rápida
A primeira ação de um usuário ocorre no dia 0; sua única outra atividade ocorre no dia 12. Segundo cada definição, ele está retido no Dia-7?
Recapitulação: Definições de Retenção
Principais conclusões sobre a retenção do Dia-N e a retenção contínua:
- Dia-N clássico: ativo exatamente no dia N (deslocamento
= N) — curva rigorosa e irregular. - Contínua: ativo no dia N ou posteriormente (
MAX offset >= N) — mais suave, monotônica e mede a fidelidade. - Limitada: ativo dentro de uma janela (
BETWEEN) — o compromisso realista. - Generalize dia para qualquer granularidade de período que corresponda à cadência do produto.
- Informe o Dia-N somente para coortes maduras (idade >= N), para evitar a armadilha da sobrevivência, e sempre pergunte qual definição a empresa quer dizer.
Perguntas Frequentes
A aula “Retenção no dia N e retenção contínua” é grátis?
Sim — o texto completo de “Retenção no dia N e retenção contínua” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “Retenção no dia N e retenção contínua”?
A diferença entre as definições clássica, contínua e limitada de retenção. Você pratica SQL Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Interview Prep?
Nenhuma experiência prévia é necessária. SQL Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Retenção no dia N e retenção contínua”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Interview Prep?
Sim. Cada aula de SQL Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Definindo uma coorte pela primeira ação
- Criando uma matriz de retenção
- Retenção no dia N e retenção contínua
- Consultas de cancelamento e retorno