0Pricing
Coding Interview Prep · Aula

Definindo uma coorte pela primeira ação

Atribuindo a cada usuário uma coorte com base na data do seu primeiro evento.

Definindo uma coorte pela primeira ação é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 1 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.

Por que as coortes aparecem em entrevistas

Quando um entrevistador de análise de produto diz "crie uma coorte", ele está avaliando se você consegue atribuir cada usuário a um grupo com base em quando ele fez algo pela primeira vez e depois acompanhar esse grupo ao longo do tempo.

Uma coorte é um conjunto de usuários que compartilham um evento inicial no mesmo período, geralmente a primeira compra, o cadastro ou o primeiro acesso. O poder das coortes está em permitir comparar usuários em condições equivalentes: todos os usuários da coorte de janeiro são avaliados a partir de seu próprio início em janeiro.

A primeira habilidade, e aquela praticada nesta lição, é calcular com confiabilidade a data da primeira ação de cada usuário.

A tabela de origem

Quase toda questão sobre coortes começa com uma tabela de eventos: uma linha por ação do usuário, com um carimbo de data e hora. Imagine uma tabela events:

  • user_id — quem realizou a ação
  • event_type — o que fez
  • event_at — quando, como carimbo de data e hora

Em uma entrevista, esclareça a granularidade em voz alta: "Há uma linha por evento e um usuário pode aparecer várias vezes?" A resposta quase sempre é sim, exatamente por isso você precisa de uma agregação para reduzir os dados à primeira ação de cada usuário.

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

Primeira ação = MIN do carimbo de data e hora

A operação central é simples: agrupe por user_id e obtenha MIN(data_do_evento). Esse mínimo é a primeira ação do usuário, o momento que o coloca em uma coorte.

Essa é a resposta que os entrevistadores querem ouvir primeiro, antes de qualquer recurso sofisticado de função de janela. Um GROUP BY simples está correto, é legível e é rápido.

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

Filtrando pelo evento definidor

Muitas vezes, a coorte é definida por uma ação específica, não por qualquer evento. "Agrupar usuários por sua primeira compra" significa que você deve filtrar as linhas de compra antes de obter o mínimo.

Coloque o filtro em WHERE para que MIN veja apenas as linhas que atendem ao critério. Uma armadilha comum em entrevistas é obter MIN sobre todos os eventos e filtrar depois, o que atribuiria a data inicial errada a qualquer pessoa que tivesse navegado antes de comprar.

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

Atribuindo a um período de coorte

Uma coorte normalmente representa um período, não um carimbo de data e hora exato: a "coorte de 2024-03" ou a "semana de 2024-03-04". Trunque a data da primeira ação até a granularidade do período.

No Postgres, use DATE_TRUNC('month', ...). No MySQL, você pode usar DATE_FORMAT(d, '%Y-%m-01'); no SQL Server, DATETRUNC(month, d) ou o primeiro dia do mês calculado. Informe seu dialeto na entrevista para que a escolha da sintaxe pareça deliberada.

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

Encapsulando em uma CTE

A atribuição da coorte por usuário é um componente que você reutilizará em consultas de retenção, portanto, coloque-a em uma CTE com um nome claro. Isso mantém as etapas seguintes legíveis e mostra ao entrevistador que você pensa em componentes que podem ser combinados.

A partir daí, qualquer consulta subsequente pode fazer uma junção com user_cohort para saber a qual grupo um usuário pertence.

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;

Tamanho da coorte: contabilizando os membros

A primeira verificação de consistência esperada pelo entrevistador é o tamanho da coorte: quantos usuários pertencem a cada coorte. Agrupe a CTE de atribuição por cohort_month e contabilize os usuários distintos.

Use COUNT(DISTINCT user_id) por segurança, mesmo que a CTE já tenha uma linha por usuário; isso mostra que você está atento à granularidade. Essa contagem se torna o denominador de todas as porcentagens de retenção posteriores.

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;

Alternativa com função de janela

Às vezes, os entrevistadores pedem o rótulo da coorte associado a cada linha de evento, e não uma tabela consolidada. Nesse caso, uma função de janela é ideal: MIN(event_at) OVER (PARTITION BY user_id) calcula a primeira ação sem remover linhas.

Isso é útil quando você precisa dos eventos detalhados e da identificação da coorte em uma única passagem, o que serve de base para a contagem de retenção.

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';

A armadilha dos empates e das duplicatas

E se um usuário tiver dois eventos exatamente no mesmo carimbo de data e hora mais antigo? MIN lida bem com isso: retorna esse único valor mínimo, independentemente de quantas linhas estejam empatadas, mantendo a atribuição de uma coorte por usuário.

Compare isso com uma abordagem usando ROW_NUMBER() ... ORDER BY event_at, na qual os empates são resolvidos arbitrariamente e você precisa adicionar um critério de desempate determinístico, como event_id, para obter um resultado estável. Mencionar essa troca sem ser solicitado demonstra experiência.

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';

Fusos horários e o limite do dia

Uma verificação sutil em entrevistas: uma compra às 23h30 em Nova York ocorre no dia seguinte em UTC. Se as coortes forem agrupadas por dia do calendário, o fuso horário determinará em qual coorte o usuário ficará.

A resposta segura é: armazene os carimbos de data e hora em UTC e depois converta-os para o fuso horário de referência do negócio antes de truncar. Diga explicitamente qual fuso define o "dia" da métrica, porque essa única decisão pode deslocar milhares de usuários entre coortes.

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;

Excluindo usuários anteriores ao período

Análises reais delimitam a coorte por um intervalo de datas, por exemplo, "coortes iniciadas no primeiro trimestre". Filtre pela data agregada da primeira ação, o que significa usar uma cláusula HAVING ou um filtro externo sobre a CTE, e não um WHERE aplicado aos eventos brutos.

Filtrar os eventos brutos por data permitiria indevidamente que um usuário cuja primeira compra ocorreu em dezembro, mas que também teve atividade no primeiro trimestre, entrasse em uma coorte do primeiro trimestre. Sempre delimite o resultado com base na primeira ação calculada.

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';

Verificação rápida

Um entrevistador pergunta: "Agrupe cada usuário pelo mês da primeira compra. Os usuários podem navegar antes de comprar." Qual abordagem está correta?

Resumo: definindo uma coorte

Principais conclusões para a questão de entrevista sobre definição de coortes:

  • Uma coorte agrupa usuários pela sua primeira ação que atende ao critério.
  • Calcule-a com MIN(event_at) depois de filtrar o evento definidor em WHERE.
  • Agrupe em um período usando DATE_TRUNC ou o equivalente do dialeto.
  • Coloque a atribuição em uma CTE para reutilização; COUNT(DISTINCT user_id) fornece o tamanho da coorte.
  • Preste atenção ao limite do dia no fuso horário e delimite os intervalos de datas com base na primeira ação calculada, nunca nos eventos brutos.

Domine isso e a matriz de retenção da próxima lição se resumirá a uma junção.

Perguntas Frequentes

A aula “Definindo uma coorte pela primeira ação” é grátis?

Sim — o texto completo de “Definindo uma coorte pela primeira ação” é 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.

O que vou aprender em “Definindo uma coorte pela primeira ação”?

Atribuindo a cada usuário uma coorte com base na data do seu primeiro evento. Você pratica Coding 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 Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding 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 1 de 4.

Quanto tempo leva a aula “Definindo uma coorte pela primeira ação”?

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 Coding Interview Prep?

Sim. Cada aula de Coding 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 Coding Interview Prep