Tämänhetkinen aktiivinen putki
Jatkuvan putken laskeminen ja sen nollaaminen katkoksen jälkeen.
Tämänhetkinen aktiivinen putki on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.
Tuotetta koskeva kysymys
Putkiominaisuudet (kuten Duolingo tai Snapchat) tarvitsevat tämänhetkisen putken, eivät historiallisesti pisintä putkea. Haastattelukysymys kuuluu: "Kuinka monta peräkkäistä päivää tähän päivään päättyen käyttäjä on ollut aktiivinen? Nollataan tulos, jos käyttäjä ei ollut aktiivinen tänään."
Tässä on yksi lisämutka: putki on ankkuroidunuttava tähän päivään (tai armonaikaa käytettäessä eiliseen). Rakennetaan se tuntemanne aukkojen ja saarekkeiden perustan päälle.
Aktiivisuuden määrittäminen
Selvittäkää ensin säännöt haastattelijan kanssa — nämä päätökset muuttavat kyselyä:
- Edellyttääkö putki aktiivisuutta tänään, vai hyväksytäänkö myös eilinen (armonaika)?
- Yhdistetäänkö useat tapahtumat päivässä yhdeksi päiväksi?
- Mikä aikavyöhyke määrittää "päivän"?
Oletamme, että aktiivista päivää kohti on yksi rivi ja että putki on tämänhetkinen, jos siihen sisältyy joko tämä päivä TAI eilinen.
Saarekkeiden muodostaminen uudelleen
Käyttäkää samaa ankkuria: numeroikaa kunkin käyttäjän päivät päivämäärän mukaan ja vähentäkää numero. Jokainen peräkkäinen jakso jakaa saman ankkurin. Tämänhetkinen putki on yksinkertaisesti saareke, jonka viimeinen päivä on tänään tai eilen.
WITH numbered AS (
SELECT user_id, login_date,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY login_date
) AS rn
FROM logins
),
islands AS (
SELECT user_id,
MIN(login_date) AS streak_start,
MAX(login_date) AS streak_end,
COUNT(*) AS streak_len
FROM numbered
GROUP BY user_id, login_date - rn
)
SELECT * FROM islands;Uusimman saarekkeen tunnistaminen
Kunkin käyttäjän uusin saareke on se, jolla on suurin streak_end-arvo. Tarkistamme, onko sen päättymispäivä riittävän tuore, jotta putki voidaan laskea jatkuvaksi.
CURRENT_DATE antaa tämän päivän. CURRENT_DATE - 1 on eilinen. Jos streak_end on jompikumpi näistä, putki on aktiivinen.
WITH /* ...numbered, islands... */
latest AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY streak_end DESC
) AS rn2
FROM islands
)
SELECT * FROM latest WHERE rn2 = 1;Tuoreustestin soveltaminen
Nyt ratkaistaan, onko uusin saareke aktiivinen. Jos sen päättymispäivä on tänään tai eilen, tämänhetkisen putken pituus on saarekkeen pituus; muussa tapauksessa käyttäjän putki on katkennut ja nykyinen arvo on 0.
SELECT user_id,
CASE
WHEN streak_end >= CURRENT_DATE - 1
THEN streak_len
ELSE 0
END AS current_streak
FROM latest
WHERE rn2 = 1;Täydellinen tämänhetkisen putken kysely
Kootkaa kaikki kerrokset: numeroikaa rivit, muodostakaa saarekkeet, valitkaa käyttäjäkohtaisesti uusin saareke ja soveltakaa sitten recency-tarkistusta CASE-lausekkeella. Tämä on täydellinen vastaus.
WITH numbered AS (
SELECT user_id, login_date,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY login_date
) AS rn
FROM logins
),
islands AS (
SELECT user_id,
MAX(login_date) AS streak_end,
COUNT(*) AS streak_len
FROM numbered
GROUP BY user_id, login_date - rn
),
latest AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY streak_end DESC
) AS rn2
FROM islands
)
SELECT user_id,
CASE WHEN streak_end >= CURRENT_DATE - 1
THEN streak_len ELSE 0 END AS current_streak
FROM latest
WHERE rn2 = 1
ORDER BY user_id;Vain tämä päivä: tiukka tulkinta
Jos liiketoimintasääntö on tiukka — putki on aktiivinen vain, jos käyttäjä on ollut aktiivinen tänään — muuttakaa vertailu vaatimaan ehtoa streak_end = CURRENT_DATE.
Armonaikaversio (>= CURRENT_DATE - 1) on käyttäjäystävällisempi ja yleinen oikeissa sovelluksissa, joissa päivä ei ole vielä päättynyt. Selvittäkää aina, kumpaa haastattelija tarkoittaa.
CASE WHEN streak_end = CURRENT_DATE
THEN streak_len ELSE 0 END AS current_streakVaihtoehto: eteneminen taaksepäin
Toinen ajattelumalli, jota jotkin haastattelijat suosivat, on laskea kunkin päivän etäisyys tähän päivään. Päivä kuuluu tämänhetkiseen putkeen vain, jos jokainen päivä siitä tähän päivään on mukana. Vastaavasti login_date-arvoa verrataan lausekkeeseen CURRENT_DATE - (offset from the latest).
Saarekkemenetelmä on yleensä selkeämpi, mutta vaihtoehdon tunteminen osoittaa ymmärryksen syvyyttä. Keskeinen ajatus on sama: katkeamaton ketju, joka on ankkuroitu tähän päivään.
Passiivisten käyttäjien sisällyttäminen
logins-taulusta puuttuvilla käyttäjillä ei ole saareketta, joten he katoavat tuloksista. Jos jokaiselle käyttäjälle on raportoitava putki (todennäköisesti 0), liittäkää käyttäjäluettelo mukaan LEFT JOIN -liitoksella ja muuttakaa tulos COALESCE-funktiolla arvoksi 0.
SELECT u.user_id,
COALESCE(s.current_streak, 0) AS current_streak
FROM users u
LEFT JOIN current_streaks s ON s.user_id = u.user_id;Aikavyöhykkeiden sudenkuopat
Jos aktiivisuus tallennetaan aikaleimoina, "tänään" riippuu aikavyöhykkeestä. Muuntakaa aikaleima ennen sen katkaisemista päivämääräksi.
- Tallentakaa ja verratkaa arvoja UTC-ajassa tai muuntakaa ne ensin käyttäjän paikalliseen aikavyöhykkeeseen.
- Käyttäkää Postgresissa lauseketta
event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tzja muuntakaa tulos sitten päivämääräksi. - Yksinkertainen
::date-muunnos UTC-aikaleimalle voi sijoittaa illalla tapahtuneen tapahtuman väärälle kalenteripäivälle.
Tämän mainitseminen ehkäisee tyypillisen jatkokysymyksen.
SELECT user_id,
(event_ts AT TIME ZONE 'UTC'
AT TIME ZONE 'America/New_York')::date AS local_day
FROM events;Suorituskyky ja yhteenveto
Usein päivitettävissä koontinäytöissä tämä kysely suoritetaan käyttäjää kohti yhtenä läpikäyntinä. Jotta se pysyy nopeana:
- Indeksoikaa
(user_id, login_date). - Rajataan syöte tarvittaessa viimeisimpiin päivämääriin — tämänhetkinen putki ei voi sisältää omaa pituuttaan vanhempaa dataa, joten esimerkiksi viimeisten 400 päivän liukuva ikkuna riittää hyvin.
- Materiaalisoikaa päivittäiset tiedot streak-taulukuksi, jos niitä luetaan erittäin usein.
Pikatarkistus
Varmistakaa, että ymmärrätte ankkuroinnin tähän hetkeen.
Kertaus
Kun lasketaan tämänhetkinen aktiivisuusputki tämän päivän tilanteen mukaan:
- Muodostakaa saarekkeet käyttämällä ankkurina lauseketta
login_date - ROW_NUMBER(). - Valitkaa kunkin käyttäjän uusin saareke suurimman
streak_end-arvon perusteella. - Palauttakaa sen pituus vain, jos
streak_endon tänään (tai armonaikaa käytettäessä eilen); muussa tapauksessa palauttakaa 0. - Käyttäkää users-taulun LEFT JOIN -liitosta passiivisten tilien sisällyttämiseen ja käsitelkää aikavyöhykkeet ennen päivämääräksi muuntamista.
Nyt hallitsette koko putkianalyysin työkalupakin: jaksojen tunnistamisen, pisimmän putken, N peräkkäisen rivin ehdot ja aktiivisen putken.
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 ”Tämänhetkinen aktiivinen putki” ilmainen?
Kyllä – oppitunnin ”Tämänhetkinen aktiivinen putki” 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 ”Tämänhetkinen aktiivinen putki”?
Jatkuvan putken laskeminen ja sen nollaaminen katkoksen jälkeen. 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 4/4.
Kuinka kauan ”Tämänhetkinen aktiivinen putki”-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
- Peräkkäisten kalenteripäivien tunnistaminen
- Käyttäjän pisin putki
- N peräkkäistä ehtoa täyttävää riviä
- Tämänhetkinen aktiivinen putki