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 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.
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_ididentifica quem realizou a açãoevent_namecontém valores como 'visita', 'cadastro', 'compra'event_timeconté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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding 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 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 “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 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
- Criando um funil de várias etapas
- Eventos ordenados e janelas de tempo
- Atribuição e métricas de teste A/B
- Incremento, significância e proteções em SQL