0Pricing
SQL Interview Prep · Aula

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-30

Escolhendo 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

  1. Definindo uma coorte pela primeira ação
  2. Criando uma matriz de retenção
  3. Retenção no dia N e retenção contínua
  4. Consultas de cancelamento e retorno
← Voltar para SQL Interview Prep