Järjestetyt tapahtumat ja aikaikkunat
Vaiheiden järjestyksen ja aikarajan sisällä tapahtumisen varmistaminen ikkunafunktioilla.
Järjestetyt tapahtumat ja aikaikkunat on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Miksi järjestys ja aika ovat tärkeitä
Edellisen oppitunnin perussuppilo tarkistaa vain, suorittiko käyttäjä kunkin vaiheen. Tarkempi haastattelija kysyy: tapahtuivatko vaiheet oikeassa järjestyksessä ja kohtuullisen ajan kuluessa?
Käyttäjä, joka teki ostoksen maanantaina mutta kävi markkinointisivulla perjantaina, ei edennyt suppilon kautta. Järjestys ja ajoitus muuttavat naiiviin lippuihin perustuvan suppilon uskottavaksi.
Käyttäjäkohtaisten ensimmäisten aikaleimojen idea
Järjestyksen arvioimiseksi tallenna kunkin käyttäjän ensimmäinen ajankohta jokaisessa vaiheessa: ensimmäinen käynti, ensimmäinen rekisteröityminen ja ensimmäinen ostos.
Selkeä konversio tarkoittaa, että first_signup_time >= first_visit_time ja sama ehto toteutuu ketjun seuraavissa vaiheissa. Vaihekohtaisesti ryhmitelty MIN(event_time) tuottaa nämä vertailukohdat.
SELECT
user_id,
MIN(CASE WHEN event_name = 'visit' THEN event_time END) AS first_visit,
MIN(CASE WHEN event_name = 'signup' THEN event_time END) AS first_signup,
MIN(CASE WHEN event_name = 'purchase' THEN event_time END) AS first_purchase
FROM events
GROUP BY user_id;Vaiheiden vaatiminen oikeassa järjestyksessä
Kun jokaiselle vaiheelle on ensimmäinen aikaleima, järjestyksen varmistaminen on vertailutehtävä. Käyttäjä on aidosti siirtynyt vaiheeseen 3 vain, jos jokainen aikaleima on olemassa ja aikaleimat kasvavat monotonisesti.
Huomaa, kuinka NULL-aikaleima (vaihetta ei koskaan tapahtunut) epäonnistuu vertailussa luonnostaan, juuri niin kuin pitääkin.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS visit_t,
MIN(CASE WHEN event_name='signup' THEN event_time END) AS signup_t,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
FROM events GROUP BY user_id
)
SELECT COUNT(*) AS converted_in_order
FROM t
WHERE visit_t IS NOT NULL
AND signup_t >= visit_t
AND purchase_t >= signup_t;Aikaikkunan lisääminen
Useimmilla suppiloilla on määräaika: "siirry seuraavaan vaiheeseen 7 päivän kuluessa ensimmäisestä käynnistä". Lisää ensimmäisen ja viimeisen vaiheen välille aikaraja.
Päivämääräaritmetiikka vaihtelee SQL-dialektin mukaan. Postgresissa voi kirjoittaa visit_t + INTERVAL '7 days' ja MySQL:ssä käyttää muotoa DATE_ADD(visit_t, INTERVAL 7 DAY). Ilmoita aina käyttämäsi dialekti.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS visit_t,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
FROM events GROUP BY user_id
)
SELECT COUNT(*) AS purchased_within_7d
FROM t
WHERE purchase_t >= visit_t
AND purchase_t < visit_t + INTERVAL '7 days';Miksi ensimmäinen aikaleima, ei mikä tahansa aikaleima
Haastattelussa esiin tuleva hienovarainen kysymys on, lasketaanko aikaikkuna käyttäjän ensimmäisestä käynnistä vai viimeisimmästä ennen rekisteröitymistä tapahtuneesta käynnistä. Se riippuu siitä, mitä tuotetta koskevaan kysymykseen haetaan vastausta.
- First-touch-ikkunat mittaavat ajan ensimmäisestä kiinnostuksen osoituksesta konversioon.
- Last-touch-ikkunat mittaavat viimeistä käyntiä seuraavan konversiopuristuksen keston.
Varmistakaa haastattelijalta, kumpaa hän tarkoittaa; harkittu valinta osoittaa senioritason ymmärrystä.
Järjestetyt tapahtumat LEAD-funktiolla
Monimutkaisissa monivaiheisissa poluissa ikkunafunktiot ovat hyödyllisiä. Järjestä kunkin käyttäjän tapahtumat ajan mukaan ja katso sitten LEAD-funktiolla seuraavaa tapahtumaa varmistaaksesi, että se on odotettu seuraava vaihe.
Tämä toimii myös poluissa, joissa vaiheiden väliin lomittuu toisiinsa liittymättömiä tapahtumia.
SELECT
user_id,
event_name,
event_time,
LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event,
LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events;Seuraavan odotetun vaiheen täsmäyttäminen
Rakenna ratkaisua LEAD-funktion päälle: säilytä rivit, joissa 'visit'-tapahtumaa seuraa välittömästi 'signup'. Näin löydetään aidot peräkkäiset siirtymät eikä vain samanaikaista esiintymistä.
Voit ketjuttaa nämä siirtymätarkistukset ja validoida koko järjestyksessä olevan polun vaihe vaiheelta.
WITH seq AS (
SELECT user_id, event_name, event_time,
LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event
FROM events
)
SELECT COUNT(DISTINCT user_id) AS visit_then_signup
FROM seq
WHERE event_name = 'visit' AND next_event = 'signup';Peräkkäisten vaiheiden välinen aika
Haastattelijat kysyvät mielellään, kuinka kauan kunkin vaiheen suorittaminen kestää. Käytä aikaleimaan LEAD-funktiota ja vähennä aikaleimat toisistaan. Peräkkäisten tapahtumien välinen ero on kyseisen vaiheen viipymäaika.
Laske siirtymäkohtainen mediaani tai keskiarvo löytääksesi suppilon hitaimman vaiheen.
WITH seq AS (
SELECT user_id, event_name, event_time,
LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events
)
SELECT
event_name,
AVG(EXTRACT(EPOCH FROM (next_time - event_time)) / 3600.0) AS avg_hours_to_next
FROM seq
WHERE next_time IS NOT NULL
GROUP BY event_name;Saman aikaleiman erikoistapaus
Mitä jos kahdella tapahtumalla on täsmälleen sama event_time? Tällöin signup_t >= visit_t on tosi, vaikka tapahtumat olisivat samanaikaisia, joten pelkkään aikaan perustuva järjestys on epäselvä.
- Käytä
>=- ja>-operaattoreita harkiten ja kerro, miksi valitsit kyseisen operaattorin. - Lisää
ORDER BY-lauseeseen esimerkiksi tapahtuman järjestystunniste, jotta ikkunafunktioiden järjestys on deterministinen.
Tämän mainitseminen oma-aloitteisesti tekee haastattelijoihin vaikutuksen.
SELECT user_id, event_name,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_time, event_id) AS step_seq
FROM events;Järjestyksen ja aikaikkunan yhdistäminen yhteen kyselyyn
Tässä on täydellinen oikeassa järjestyksessä ja aikaikkunan sisällä toimiva suppilo. Se käyttää ensimmäistä käyntiä kiintopisteenä, vaatii kunkin myöhemmän vaiheen ensimmäisen esiintymän tapahtuvan edellisen jälkeen ja rajaa koko polun seitsemään päivään.
Tämä erottaa suppilot ymmärtävän ehdokkaan ehdokkaasta, joka osaa vain laskea lippuja.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS v,
MIN(CASE WHEN event_name='signup' THEN event_time END) AS s,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS p
FROM events GROUP BY user_id
)
SELECT
COUNT(*) FILTER (WHERE v IS NOT NULL) AS visited,
COUNT(*) FILTER (WHERE s >= v AND s < v + INTERVAL '7 days') AS signed_up,
COUNT(*) FILTER (WHERE s >= v AND p >= s AND p < v + INTERVAL '7 days') AS purchased
FROM t;Eri SQL-dialektien huomioita
Kaksi siirrettävyyteen liittyvää muistutusta reaaliaikaista koodausta varten:
- Aggregaattien yhteydessä käytettävä
FILTER (WHERE ...)on standardin SQL:n mukainen ja toimii Postgresissa; MySQL:ssä tai vanhemmissa tietokantamoottoreissa käytä sen sijaan muotoaSUM(CASE WHEN ... THEN 1 ELSE 0 END). - Intervallisyntaksi vaihtelee: Postgres
+ INTERVAL '7 days', MySQLDATE_ADD(d, INTERVAL 7 DAY)ja SQL ServerDATEADD(day, 7, d).
Ilmoittakaa oletuksenne, niin haastattelijalle on yleensä yhdentekevää, mitä dialektia käytätte, kunhan tiedätte niiden eroavan toisistaan.
Pikatarkistus
Käyttäjät, jotka suorittivat käynnin -> rekisteröitymisen -> ostoksen tässä järjestyksessä seitsemän päivän kuluessa ensimmäisestä käynnistä. Mikä lähestymistapa on oikea?
Kertaus: järjestetyt tapahtumat ja aikaikkunat
Keskeiset opit:
- Tallentakaa kunkin käyttäjän ensimmäinen aikaleima kussakin vaiheessa komennolla
MIN(CASE ...). - Varmistakaa järjestys edellyttämällä, että kunkin vaiheen aika on edellisen vaiheen ajankohtana tai sen jälkeen.
- Rajaatkaa polku aikavälillä ja ilmoittakaa käyttämänne SQL-murteen syntaksi.
- Käyttäkää
LEAD/LAG-funktioita siirtymien tarkistamiseen ja vaiheiden välisen viipymäajan laskemiseen. - Käsitelkää saman aikaleiman tasatilanteet lisäämällä
ORDER BY-lausekkeeseen ratkaiseva lisäkriteeri.
Seuraavaksi siirrymme suppiloista kokeisiin ja varianttikohtaisten mittareiden laskemiseen.
Opi Valmistautuminen ohjelmointihaastatteluihin tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 90
- Oppitunnit
- 360
Usein kysytyt kysymykset
Onko oppitunti ”Järjestetyt tapahtumat ja aikaikkunat” ilmainen?
Kyllä – oppitunnin ”Järjestetyt tapahtumat ja aikaikkunat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Järjestetyt tapahtumat ja aikaikkunat”?
Vaiheiden järjestyksen ja aikarajan sisällä tapahtumisen varmistaminen ikkunafunktioilla. Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Järjestetyt tapahtumat ja aikaikkunat”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?
Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Monivaiheisen suppilon rakentaminen
- Järjestetyt tapahtumat ja aikaikkunat
- A/B-testin jako ja mittarit
- Lift, merkitsevyys ja suojarajat SQL:ssä