0Pricing
SQL Interview Prep · Aula

Criando um funil de várias etapas

Contando os usuários que chegam a cada etapa ordenada e calculando as taxas de conversão entre etapas.

Criando um funil de várias etapas é uma aula grátis de SQL 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 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.

O que uma pergunta sobre funil realmente avalia

Quando um entrevistador diz "monte um funil de cadastro", ele está avaliando se você consegue contar usuários distintos que alcançam cada etapa ordenada e expressar a perda entre elas.

Um funil tem etapas como visit -> signup -> activate -> purchase. O resultado esperado geralmente é uma linha por etapa, com a contagem de usuários e uma taxa de conversão.

  • Conte usuários, não eventos (se um usuário gerar um evento duas vezes, ainda será apenas um usuário).
  • As etapas são ordenadas; alcançar a etapa 3 significa que o usuário passou pelas etapas 1 e 2.

A tabela de eventos que será fornecida

Quase toda pergunta sobre funil fornece uma única tabela de eventos em formato longo. Imagine esta estrutura:

  • user_id identifica quem realizou a ação
  • event_name contém valores como 'visita', 'cadastro', 'compra'
  • event_time contém uma marca temporal

Há uma linha por ação. Seu trabalho é reorganizar esses dados em uma contagem passo a passo. Sempre confirme os nomes exatos dos eventos com o entrevistador antes de escrever SQL.

CREATE TABLE events (
  user_id    INT,
  event_name VARCHAR(50),
  event_time TIMESTAMP
);

Contando usuários em uma etapa

Comece pelo simples: quantos usuários distintos chegaram a uma determinada etapa? Use COUNT(DISTINCT user_id) com um filtro pelo nome do evento.

Este é o bloco básico de todo funil. Se você consegue contar uma etapa com clareza, consegue contar todas.

SELECT COUNT(DISTINCT user_id) AS users_who_signed_up
FROM events
WHERE event_name = 'signup';

Agregação condicional para todas as etapas

A resposta mais clara em uma entrevista conta todas as etapas em uma única passagem usando agregação condicional: um CASE dentro de COUNT(DISTINCT ...).

Para cada etapa, conte os usuários distintos cujo evento corresponde a ela. Uma varredura, uma linha com os totais das etapas.

SELECT
  COUNT(DISTINCT CASE WHEN event_name = 'visit'    THEN user_id END) AS step1_visit,
  COUNT(DISTINCT CASE WHEN event_name = 'signup'   THEN user_id END) AS step2_signup,
  COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN user_id END) AS step3_purchase
FROM events;

A armadilha oculta: as etapas não estão ordenadas

A consulta que você acabou de ver tem uma armadilha que os entrevistadores adoram. Ela conta qualquer pessoa que tenha gerado o evento 'compra', mesmo que nunca tenha visitado ou feito o cadastro nos dados.

Um funil real exige que cada etapa posterior seja um subconjunto da etapa anterior. Contar os eventos de forma independente pode produzir uma etapa 3 maior que a etapa 2, o que é logicamente impossível em um funil.

A correção é vincular as etapas de cada usuário, geralmente consolidando primeiro os dados em uma linha por usuário.

Uma linha por usuário com indicadores

O padrão robusto é consolidar o registro de eventos em uma linha por usuário, com um indicador booleano (como 0/1) que informa se ele realizou cada etapa. MAX(CASE ...) transforma o registro longo em um resumo amplo por usuário.

WITH user_steps AS (
  SELECT
    user_id,
    MAX(CASE WHEN event_name = 'visit'    THEN 1 ELSE 0 END) AS did_visit,
    MAX(CASE WHEN event_name = 'signup'   THEN 1 ELSE 0 END) AS did_signup,
    MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS did_purchase
  FROM events
  GROUP BY user_id
)
SELECT * FROM user_steps;

Garantindo a ordem das etapas

Agora aplique a regra do funil: um usuário só conta para a etapa N se também tiver realizado todas as etapas anteriores. Chegar à 'compra' só importa se ele também tiver visitado a página e feito o cadastro.

Some os indicadores com as condições prévias combinadas por AND, para que cada etapa seja realmente um subconjunto da anterior.

WITH user_steps AS (
  SELECT
    user_id,
    MAX(CASE WHEN event_name = 'visit'    THEN 1 ELSE 0 END) AS did_visit,
    MAX(CASE WHEN event_name = 'signup'   THEN 1 ELSE 0 END) AS did_signup,
    MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS did_purchase
  FROM events
  GROUP BY user_id
)
SELECT
  SUM(did_visit)                                       AS step1_visit,
  SUM(CASE WHEN did_visit = 1 AND did_signup = 1 THEN 1 ELSE 0 END)                       AS step2_signup,
  SUM(CASE WHEN did_visit = 1 AND did_signup = 1 AND did_purchase = 1 THEN 1 ELSE 0 END)  AS step3_purchase
FROM user_steps;

Transformando as contagens em um resultado longo organizado

Os entrevistadores geralmente preferem uma linha por etapa, em vez de uma única linha ampla. Converta os totais amplos para o formato longo com um pequeno UNION ALL, adicionando um número à etapa para ordenação.

Isso facilita muito o cálculo da taxa de conversão e a criação de gráficos na próxima etapa.

WITH funnel AS (
  SELECT 1 AS step_no, 'visit'    AS step_name, 1000 AS users UNION ALL
  SELECT 2,           'signup',                   420  UNION ALL
  SELECT 3,           'purchase',                 95
)
SELECT step_no, step_name, users
FROM funnel
ORDER BY step_no;

Taxa de conversão de uma etapa para a seguinte

Duas taxas são importantes, e os entrevistadores perguntarão a qual delas você se refere:

  • Conversão da etapa: usuários nesta etapa divididos pelos usuários da etapa anterior.
  • Conversão geral: usuários nesta etapa divididos pelos usuários do topo do funil.

Use LAG para obter a contagem da etapa anterior e calcular a taxa de uma etapa para a seguinte. Converta o valor para decimal para evitar a divisão inteira.

WITH funnel AS (
  SELECT 1 AS step_no, 'visit'    AS step_name, 1000 AS users UNION ALL
  SELECT 2,           'signup',                   420  UNION ALL
  SELECT 3,           'purchase',                 95
)
SELECT
  step_name,
  users,
  ROUND(100.0 * users / LAG(users) OVER (ORDER BY step_no), 1) AS step_conv_pct
FROM funnel
ORDER BY step_no;

Conversão geral a partir do topo

Para calcular a conversão geral, divida cada etapa pela contagem da primeira etapa. FIRST_VALUE sobre o funil ordenado fixa esse número do topo para todas as linhas.

Sempre mencione ao entrevistador que você evitou a divisão inteira multiplicando por 100.0.

WITH funnel AS (
  SELECT 1 AS step_no, 'visit'    AS step_name, 1000 AS users UNION ALL
  SELECT 2,           'signup',                   420  UNION ALL
  SELECT 3,           'purchase',                 95
)
SELECT
  step_name,
  users,
  ROUND(100.0 * users / FIRST_VALUE(users) OVER (ORDER BY step_no), 1) AS overall_pct
FROM funnel
ORDER BY step_no;

Montando o funil completo

Esta é a resposta de ponta a ponta que os entrevistadores esperam: consolide os indicadores por usuário, garanta a ordem, converta para o formato longo e, em seguida, calcule as duas taxas. Explique cada etapa em voz alta, indicando a finalidade de cada CTE.

Essa estrutura é escalável: adicione uma etapa acrescentando um indicador e uma linha de UNION ALL.

WITH user_steps AS (
  SELECT user_id,
    MAX(CASE WHEN event_name = 'visit'    THEN 1 ELSE 0 END) AS s1,
    MAX(CASE WHEN event_name = 'signup'   THEN 1 ELSE 0 END) AS s2,
    MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS s3
  FROM events GROUP BY user_id
),
totals AS (
  SELECT 1 AS step_no, 'visit'    AS step_name, SUM(s1) AS users FROM user_steps UNION ALL
  SELECT 2, 'signup',   SUM(CASE WHEN s1=1 AND s2=1 THEN 1 ELSE 0 END) FROM user_steps UNION ALL
  SELECT 3, 'purchase', SUM(CASE WHEN s1=1 AND s2=1 AND s3=1 THEN 1 ELSE 0 END) FROM user_steps
)
SELECT step_name, users,
  ROUND(100.0 * users / LAG(users) OVER (ORDER BY step_no), 1) AS step_pct
FROM totals ORDER BY step_no;

Verificação rápida

Um entrevistador percebe que seu funil mostra 95 usuários na etapa de 'compra', mas apenas 80 na etapa de 'cadastro'. Qual é a causa mais provável?

Resumo: funis com várias etapas

Agora você consegue montar um funil da maneira esperada em entrevistas:

  • Conte usuários distintos por etapa ordenada, nunca eventos brutos.
  • Consolide o registro de eventos em uma linha por usuário com indicadores criados por MAX(CASE ...).
  • Garanta a ordem para que cada etapa seja um subconjunto da etapa anterior.
  • Calcule a conversão de uma etapa para a seguinte (LAG) e a conversão geral (FIRST_VALUE), evitando a divisão inteira.

Próximo passo: garantir que essas etapas realmente tenham ocorrido na sequência correta e dentro de um intervalo de tempo.

Perguntas Frequentes

A aula “Criando um funil de várias etapas” é grátis?

Sim — o texto completo de “Criando um funil de várias etapas” é 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 “Criando um funil de várias etapas”?

Contando os usuários que chegam a cada etapa ordenada e calculando as taxas de conversão entre etapas. 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 1 de 4.

Quanto tempo leva a aula “Criando um funil de várias etapas”?

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. Criando um funil de várias etapas
  2. Eventos ordenados e janelas de tempo
  3. Atribuição e métricas de teste A/B
  4. Incremento, significância e proteções em SQL
← Voltar para SQL Interview Prep