Bygge en trakt med flere trinn
Telle brukere som når hvert trinn i riktig rekkefølge, og beregne konverteringsrater mellom trinnene.
Bygge en trakt med flere trinn er en gratis leksjon i Forberedelse til SQL-intervju på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til SQL-intervju, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.
Hva et funnel-spørsmål egentlig tester
Når en intervjuer sier "bygg en signup-funnel", tester vedkommende om du kan telle unike brukere som når hvert trinn i riktig rekkefølge, og uttrykke frafallet mellom trinnene.
En funnel har trinn som visit -> signup -> activate -> purchase. Resultatet er vanligvis én rad per trinn med et brukerantall og en konverteringsrate.
- Tell brukere, ikke hendelser (én bruker som utløser en hendelse to ganger, er fortsatt én bruker).
- Trinnene er ordnet; å nå trinn 3 innebærer at brukeren har passert trinn 1 og 2.
Hendelsestabellen du får oppgitt
Nesten alle funnel-spørsmål gir deg én enkelt events-tabell i langt format. Se for deg denne strukturen:
user_idsom utførte handlingenevent_namesom 'visit', 'signup', 'purchase'event_timeet tidsstempel
Én rad per handling. Oppgaven din er å omforme dette til en trinnvis opptelling. Avklar alltid de nøyaktige hendelsesnavnene med intervjueren før du skriver SQL.
CREATE TABLE events (
user_id INT,
event_name VARCHAR(50),
event_time TIMESTAMP
);Telle brukere på ett trinn
Start enkelt: Hvor mange unike brukere nådde ett bestemt trinn? Bruk COUNT(DISTINCT user_id) med et filter på hendelsesnavnet.
Dette er byggesteinen i enhver funnel. Hvis du kan telle ett trinn på en ryddig måte, kan du telle dem alle.
SELECT COUNT(DISTINCT user_id) AS users_who_signed_up
FROM events
WHERE event_name = 'signup';Betinget aggregering for alle trinn
Det ryddige intervjusvaret teller alle trinn i én gjennomgang ved hjelp av betinget aggregering: en CASE inni COUNT(DISTINCT ...).
For hvert trinn teller du de unike brukerne som har en hendelse som samsvarer med trinnet. Én gjennomgang, én rad med trinntotaler.
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;Den skjulte feilen: Trinnene er ikke ordnet
Spørringen du nettopp så, inneholder en felle som intervjuere liker. Den teller alle som utløste 'purchase', selv om de aldri besøkte siden eller registrerte seg i dataene.
En ekte funnel krever at hvert senere trinn er en delmengde av det tidligere trinnet. Hvis hendelser telles uavhengig av hverandre, kan trinn 3 bli større enn trinn 2, noe som er logisk umulig for en funnel.
Løsningen er å knytte brukerens trinn sammen, vanligvis ved først å redusere dataene til én rad per bruker.
Én rad per bruker med flagg
Det robuste mønsteret er å redusere hendelsesloggen til én rad per bruker, med et boolsk flagg (som 0/1) for om brukeren noen gang utførte hvert trinn. MAX(CASE ...) gjør den lange loggen om til en bred oppsummering per bruker.
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;Håndheve trinnrekkefølgen
Nå håndhever du funnel-regelen: En bruker teller bare for trinn N hvis vedkommende også utførte hvert tidligere trinn. Det er bare relevant at brukeren nådde 'purchase' hvis vedkommende også besøkte siden og registrerte seg.
Summer flaggene med forutsetningsbetingelsene koblet sammen med AND, slik at hvert trinn faktisk blir en delmengde av det foregående trinnet.
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;Gjøre antallene om til et ryddig resultat i langt format
Intervjuere foretrekker ofte én rad per trinn i stedet for én bred rad. Gjør de brede totalene om til langt format med en liten UNION ALL, og legg til et trinnnummer for sortering.
Dette gjør beregning av konverteringsrater og visualisering mye enklere i neste trinn.
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;Konverteringsrate fra trinn til trinn
To rater er viktige, og intervjueren vil spørre hvilken du mener:
- Trinnkonvertering: antall brukere på dette trinnet delt på antall brukere på det forrige trinnet.
- Total konvertering: antall brukere på dette trinnet delt på antall brukere på det øverste trinnet i funnel-en.
Bruk LAG for å hente antallet på det forrige trinnet til raten fra trinn til trinn. Konverter til et desimaltall, slik at du unngår heltallsdivisjon.
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;Total konvertering fra toppen
For total konvertering deler du hvert trinn på antallet på det første trinnet. FIRST_VALUE over den sorterte funnel-en låser dette toppantallet for hver rad.
Si alltid til intervjueren at du har håndtert heltallsdivisjon ved å multiplisere med 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;Sette sammen hele funnel-en
Her er svaret fra ende til ende som intervjuere ønsker: reduser til flagg per bruker, håndhev rekkefølgen, gjør dataene om til langt format, og beregn deretter begge ratene. Gå gjennom dette høyt og forklar formålet med hver CTE.
Denne strukturen skalerer: Legg til et trinn ved å legge til ett flagg og én UNION ALL-rad.
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;Kort kontroll
En intervjuer legger merke til at funnel-en din viser 95 brukere på 'purchase', men bare 80 på 'signup'. Hva er den mest sannsynlige årsaken?
Oppsummering: Funneler med flere trinn
Nå kan du bygge en funnel slik intervjuer forventer:
- Tell unike brukere per ordnet trinn, aldri rå hendelser.
- Reduser hendelsesloggen til én rad per bruker med
MAX(CASE ...)-flagg. - Håndhev rekkefølgen slik at hvert trinn er en delmengde av det foregående.
- Beregn konvertering fra trinn til trinn (LAG) og totalt (FIRST_VALUE), og håndter heltallsdivisjon.
Neste: Sørg for at trinnene faktisk skjedde i riktig rekkefølge og innenfor et tidsvindu.
Lær deg SQL med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 30
- Leksjoner
- 120
Ofte stilte spørsmål
Er leksjonen «Bygge en trakt med flere trinn» gratis?
Ja – hele teksten i «Bygge en trakt med flere trinn» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til SQL-intervju-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.
Hva lærer jeg i «Bygge en trakt med flere trinn»?
Telle brukere som når hvert trinn i riktig rekkefølge, og beregne konverteringsrater mellom trinnene. Du øver på Forberedelse til SQL-intervju med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Forberedelse til SQL-intervju?
Ingen tidligere erfaring er nødvendig. Forberedelse til SQL-intervju på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Bygge en trakt med flere trinn»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Forberedelse til SQL-intervju-leksjonen?
Ja. Alle Forberedelse til SQL-intervju-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Bygge en trakt med flere trinn
- Hendelser i riktig rekkefølge og tidsvinduer
- Tildeling og måltall i A/B-tester
- Løft, signifikans og kontrollgrenser i SQL