0Pricing
SQL Interview Prep · Lezione

Creare un funnel a più passaggi

Conteggio degli utenti che raggiungono ogni passaggio nell'ordine previsto e calcolo dei tassi di conversione tra i passaggi.

Creare un funnel a più passaggi è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.

Che cosa verifica davvero una domanda sui funnel

Quando un intervistatore dice "costruisca un funnel di registrazione", sta verificando se sa contare gli utenti distinti che raggiungono ogni passaggio ordinato e rappresentare il calo tra un passaggio e l'altro.

Un funnel comprende passaggi come visit -> signup -> activate -> purchase. In genere il risultato richiesto è una riga per passaggio, con il conteggio degli utenti e un tasso di conversione.

  • Conti gli utenti, non gli eventi: se un utente genera due volte lo stesso evento, conta comunque una sola volta.
  • I passaggi sono ordinati: raggiungere il passaggio 3 implica aver superato i passaggi 1 e 2.

La tabella degli eventi che verrà fornita

Quasi ogni domanda sui funnel fornisce un'unica tabella events in formato long. Immagini questa struttura:

  • user_id, ovvero chi ha eseguito l'azione
  • event_name, ad esempio 'visit', 'signup', 'purchase'
  • event_time, ovvero un timestamp

Una riga per azione. Il compito è trasformare questi dati in un conteggio passaggio per passaggio. Confermi sempre con l'intervistatore i nomi esatti degli eventi prima di scrivere SQL.

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

Contare gli utenti per un singolo passaggio

Inizi in modo semplice: quanti utenti distinti hanno raggiunto un singolo passaggio? Usi COUNT(DISTINCT user_id) filtrando per nome dell'evento.

Questo è il componente di base di ogni funnel. Se sa contare correttamente un passaggio, può contarli tutti.

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

Aggregazione condizionale per tutti i passaggi

La risposta più efficace in un colloquio conta tutti i passaggi in un'unica scansione usando l'aggregazione condizionale: un CASE all'interno di COUNT(DISTINCT ...).

Per ogni passaggio, conti gli utenti distinti il cui evento corrisponde a quel passaggio. Una scansione, una riga con i totali dei passaggi.

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;

Il problema nascosto: i passaggi non sono ordinati

La query appena vista contiene un'insidia che gli intervistatori amano proporre. Conta chiunque abbia generato l'evento 'purchase', anche se non ha mai visitato il sito né effettuato la registrazione nei dati.

Un funnel reale richiede che ogni passaggio successivo sia un sottoinsieme del passaggio precedente. Contare gli eventi in modo indipendente può produrre un numero di utenti al passaggio 3 maggiore di quello al passaggio 2, cosa logicamente impossibile in un funnel.

La soluzione è collegare i passaggi di ogni utente, di solito riducendo prima i dati a una sola riga per utente.

Una riga per utente con flag

Il modello robusto consiste nel ridurre il log degli eventi a una riga per utente, con un flag booleano, espresso come 0/1, che indichi se l'utente ha mai eseguito ciascun passaggio. MAX(CASE ...) trasforma il log in formato long in un riepilogo per utente in formato wide.

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;

Imporre l'ordine dei passaggi

Ora imponga la regola del funnel: un utente conta per il passaggio N solo se ha eseguito anche tutti i passaggi precedenti. Raggiungere 'purchase' conta solo se l'utente ha anche visitato il sito e effettuato la registrazione.

Sommi i flag applicando con AND le condizioni preliminari, in modo che ogni passaggio sia davvero un sottoinsieme di quello precedente.

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;

Trasformare i conteggi in un risultato long ordinato

Gli intervistatori spesso preferiscono una riga per passaggio anziché una sola riga wide. Trasformi i totali wide in formato long con un piccolo UNION ALL, associando un numero al passaggio per ordinarli.

Questo semplifica notevolmente il calcolo dei tassi di conversione e la creazione di grafici nel passaggio successivo.

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;

Tasso di conversione da un passaggio al successivo

Ci sono due tassi importanti, e l'intervistatore chiederà quale intende:

  • Conversione del passaggio: utenti a questo passaggio divisi per gli utenti del passaggio precedente.
  • Conversione complessiva: utenti a questo passaggio divisi per quelli all'inizio del funnel.

Usi LAG per recuperare il conteggio del passaggio precedente e calcolare il tasso da un passaggio al successivo. Converta il risultato in decimale per evitare la divisione intera.

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;

Conversione complessiva dall'inizio del funnel

Per la conversione complessiva, divida ogni passaggio per il conteggio del primo passaggio. FIRST_VALUE applicato al funnel ordinato fissa quel numero iniziale per ogni riga.

Specifichi sempre all'intervistatore di aver gestito la divisione intera moltiplicando per 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;

Comporre l'intero funnel

Ecco la risposta completa che gli intervistatori si aspettano: ridurre i dati a flag per utente, imporre l'ordine, trasformare il risultato in formato long e calcolare entrambi i tassi. Illustri il procedimento a voce, spiegando lo scopo di ogni CTE.

Questa struttura è scalabile: per aggiungere un passaggio basta aggiungere un flag e una riga 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 rapida

Un intervistatore nota che il funnel mostra 95 utenti al passaggio 'purchase', ma solo 80 al passaggio 'signup'. Qual è la causa più probabile?

Riepilogo: funnel a più passaggi

Ora sa costruire un funnel nel modo atteso nei colloqui:

  • Conti gli utenti distinti per ogni passaggio ordinato, mai gli eventi grezzi.
  • Riduca il log degli eventi a una riga per utente con flag MAX(CASE ...).
  • Imponi l'ordine, in modo che ogni passaggio sia un sottoinsieme di quello precedente.
  • Calcoli la conversione da un passaggio al successivo (LAG) e quella complessiva (FIRST_VALUE), gestendo la divisione intera.

Successivamente: verificare che questi passaggi si siano effettivamente verificati nella sequenza corretta e all'interno di una finestra temporale.

Domande Frequenti

La lezione «Creare un funnel a più passaggi» è gratuita?

Sì — il testo completo di «Creare un funnel a più passaggi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Creare un funnel a più passaggi»?

Conteggio degli utenti che raggiungono ogni passaggio nell'ordine previsto e calcolo dei tassi di conversione tra i passaggi. Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Interview Prep?

Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Creare un funnel a più passaggi»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?

Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Creare un funnel a più passaggi
  2. Eventi ordinati e finestre temporali
  3. Assegnazione e metriche dei test A/B
  4. Incremento, significatività e controlli di sicurezza in SQL
← Torna a SQL Interview Prep