Gjeldende aktive rekke per i dag
Beregning av en pågående rekke og tilbakestilling når den brytes.
Gjeldende aktive rekke per i dag er en gratis leksjon i Forberedelse til kodeintervjuer på CoddyKit. Dette er leksjon 4 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 kodeintervjuer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.
Produktspørsmålet
Seriefunksjoner (tenk Duolingo eller Snapchat) trenger den aktive serien, ikke den historisk lengste. Oppgaven i intervjuet er: «Hvor mange sammenhengende dager, regnet bakover fra i dag, har hver bruker vært aktiv? Sett verdien til 0 hvis brukeren ikke var aktiv i dag.»
Dette gir en ekstra utfordring: Serien må være forankret til i dag (eller i går ved en nådefrist). La oss bygge den på grunnlaget for gaps-and-islands som De allerede kjenner.
Definer aktivitet
Avklar først reglene med intervjueren — disse valgene endrer spørringen:
- Krever serien aktivitet i dag, eller er i går akseptabelt (grace period)?
- Slås flere hendelser per dag sammen til én dag?
- Hvilken tidssone definerer en «dag»?
Vi antar én rad per aktiv dag, og at serien er aktiv hvis den inkluderer i dag ELLER i går.
Bygg øyene på nytt
Bruk ankeret på nytt: Nummerer hver brukers dager etter dato, og trekk fra. Hver sammenhengende rekke deler en forankring. Den aktive serien er ganske enkelt øya der siste dag er i dag eller i går.
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;Finn den nyeste øya
Hver brukers nyeste øy er den som har størst streak_end. Vi tester om sluttdatoen er nylig nok til at serien fortsatt skal telle.
CURRENT_DATE gir dagens dato. CURRENT_DATE - 1 er gårsdagen. Hvis streak_end er lik en av disse, er serien aktiv.
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;Bruk testen for aktualitet
Avgjør nå om den nyeste øya er aktiv. Hvis sluttdatoen er i dag eller i går, er den aktive serien lik øyas lengde. Ellers har brukeren brutt serien sin, og gjeldende verdi er 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;Den komplette spørringen for aktiv serie
Sett sammen alle lagene: nummerer, bygg øyer, velg den nyeste per bruker, og bruk deretter CASE for aktualitet. Dette er det komplette svaret.
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;Streng regel: bare i dag
Hvis forretningsregelen er streng — serien er aktiv bare hvis brukeren var aktiv i dag — endrer De sammenligningen slik at den krever streak_end = CURRENT_DATE.
Varianten med nådefrist (>= CURRENT_DATE - 1) er mer brukervennlig og vanlig i virkelige apper, der dagen ennå ikke er over. Bekreft alltid hvilken variant intervjueren ønsker.
CASE WHEN streak_end = CURRENT_DATE
THEN streak_len ELSE 0 END AS current_streakEt alternativ: Gå bakover
En annen mental modell som noen intervjuere foretrekker, er å beregne avstanden fra hver dag til i dag. En dag inngår i den aktive serien bare hvis alle dager fra den og fram til i dag finnes. Tilsvarende sammenligner De login_date med CURRENT_DATE - (offset from the latest).
Øymetoden er vanligvis ryddigere, men det viser faglig dybde å kjenne et alternativ. Hovedideen er den samme: en ubrutt kjede forankret til i dag.
Ta med inaktive brukere
Brukere som mangler i logins, har ingen øy og forsvinner. Hvis alle brukere må få rapportert en serie (sannsynligvis 0), bruker De LEFT JOIN mot brukerlisten og COALESCE resultatet til 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;Tidssonefeller
Hvis aktiviteten lagres som tidsstempler, avhenger «i dag» av tidssonen. Konverter før De forkorter til en dato.
- Lagre og sammenlign i UTC, eller konverter først til brukerens lokale tidssone.
- Bruk
event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tzi Postgres, og konverter deretter til dato. - En naiv
::datepå et UTC-tidsstempel kan plassere en hendelse på kveldstid på feil kalenderdag.
Hvis De nevner dette, forebygger De en klassisk oppfølgingsfelle.
SELECT user_id,
(event_ts AT TIME ZONE 'UTC'
AT TIME ZONE 'America/New_York')::date AS local_day
FROM events;Ytelse og avslutning
For oversikter som oppdateres ofte, kjører denne spørringen per bruker i én gjennomgang. Slik holder De den rask:
- Opprett en indeks på
(user_id, login_date). - Begrens eventuelt inndataene til nyere datoer — en aktiv serie kan ikke inneholde data som er eldre enn seriens egen lengde, så et rullerende vindu på for eksempel de siste 400 dagene er mer enn nok.
- Materialiser dataene per dag i en serietabell hvis de leses svært ofte.
Rask kontroll
Bekreft at De forstår forankringen til «nå».
Oppsummering
Slik beregner De den aktive serien per i dag:
- Bygg øyer med forankringen
login_date - ROW_NUMBER(). - Velg hver brukers nyeste øy basert på maksimum av
streak_end. - Returner lengden bare hvis
streak_ender i dag (eller i går ved nådefrist), ellers 0. - Bruk LEFT JOIN users for inaktive kontoer, og håndter tidssoner før De forkorter til en dato.
De behersker nå hele verktøykassen for serieanalyse: finne rekker, lengste serie, betingelser med N sammenhengende rader og den aktive serien.
Lær deg Forberedelse til kodeintervjuer 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
- 90
- Leksjoner
- 360
Ofte stilte spørsmål
Er leksjonen «Gjeldende aktive rekke per i dag» gratis?
Ja – hele teksten i «Gjeldende aktive rekke per i dag» 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 kodeintervjuer-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.
Hva lærer jeg i «Gjeldende aktive rekke per i dag»?
Beregning av en pågående rekke og tilbakestilling når den brytes. Du øver på Forberedelse til kodeintervjuer 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 kodeintervjuer?
Ingen tidligere erfaring er nødvendig. Forberedelse til kodeintervjuer 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 4 av 4.
Hvor lang tid tar leksjonen «Gjeldende aktive rekke per i dag»?
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 kodeintervjuer-leksjonen?
Ja. Alle Forberedelse til kodeintervjuer-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
- Oppdage sammenhengende kalenderdager
- Lengste rekke per bruker
- N sammenhengende rader som oppfyller en betingelse
- Gjeldende aktive rekke per i dag