Aktuell aktiv svit per idag
Beräkna en pågående svit och återställ den när den bryts.
Aktuell aktiv svit per idag är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Produktfrågan
Svitfunktioner (tänk Duolingo eller Snapchat) behöver den aktuella sviten, inte den historiskt längsta. Intervjufrågan är: "För varje användare, hur många på varandra följande dagar som slutar i dag har användaren varit aktiv? Återställ till 0 om användaren missade i dag."
Här tillkommer en detalj: sviten måste vara förankrad i i dag (eller i går enligt en respitregel). Låt oss bygga den med utgångspunkt i metoden med luckor och öar som ni redan känner till.
Definiera aktivitet
Förtydliga först reglerna med intervjuaren — dessa beslut ändrar frågan:
- Måste sviten kräva aktivitet i dag, eller är i går också godkänt (respitperiod)?
- Ska flera händelser per dag slås ihop till en dag?
- Vilken tidszon definierar en "dag"?
Vi antar en rad per aktiv dag och att sviten är aktuell om den inkluderar i dag ELLER i går.
Bygg öarna igen
Återanvänd ankaret: numrera varje användares dagar efter datum och subtrahera. Alla på varandra följande dagar i samma följd delar ankare. Den aktuella sviten är helt enkelt den ö vars sista dag är 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;Identifiera den senaste ön
Varje användares senaste ö är den med det största värdet på streak_end. Vi testar om slutet är tillräckligt nyligt för att sviten ska räknas som pågående.
CURRENT_DATE ger dagens datum. CURRENT_DATE - 1 är gårdagens datum. Om streak_end motsvarar något av dem är sviten 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;Tillämpa aktualitetstestet
Avgör nu om den senaste ön är aktiv. Om slutdatumet är i dag eller i går är den aktuella sviten lika lång som ön; annars har användaren brutit sin svit och det aktuella värdet är 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 kompletta frågan för aktuell svit
Sammanställ alla lager: numrera, bygg öar, välj den senaste per användare och tillämpa sedan CASE för aktualitet. Det här är det kompletta 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;Strikt krav på i dag
Om affärsregeln är strikt — sviten är aktiv endast om användaren var aktiv i dag — ändrar ni jämförelsen så att den kräver streak_end = CURRENT_DATE.
Versionen med respitperiod (>= CURRENT_DATE - 1) är mer användarvänlig och vanlig i riktiga appar, där dagen ännu inte är slut. Bekräfta alltid vilken variant intervjuaren vill ha.
CASE WHEN streak_end = CURRENT_DATE
THEN streak_len ELSE 0 END AS current_streakEtt alternativ: gå bakåt
En annan mental modell som vissa intervjuare föredrar är att beräkna avståndet från varje dag till i dag. En dag ingår i den aktuella sviten endast om varje dag från den till i dag finns med. Ekvivalent kan ni jämföra login_date med CURRENT_DATE - (offset from the latest).
Ömetoden är vanligtvis renare, men att känna till ett alternativ visar djup. Grundidén är densamma: en obruten kedja som är förankrad i i dag.
Inkludera inaktiva användare
Användare som saknas i logins har ingen ö och försvinner. Om varje användare måste få en svit rapporterad (troligen 0), använder ni LEFT JOIN mot användarlistan och använder COALESCE för att ersätta resultatet med 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;Fallgropar med tidszoner
Om aktivitet lagras som tidsstämplar beror "i dag" på tidszonen. Konvertera innan ni trunkerar till ett datum.
- Lagra och jämför i UTC, eller konvertera först till användarens lokala tidszon.
- Använd
event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tzi Postgres och konvertera sedan till datum. - En naiv
::datepå en UTC-tidsstämpel kan placera en händelse på kvällen på fel kalenderdag.
Om ni nämner detta förebygger ni en klassisk följdfråga om en fallgrop.
SELECT user_id,
(event_ts AT TIME ZONE 'UTC'
AT TIME ZONE 'America/New_York')::date AS local_day
FROM events;Prestanda och avslutning
För instrumentpaneler som uppdateras ofta körs den här frågan per användare i en enda genomläsning. Så här håller ni den snabb:
- Skapa ett index på
(user_id, login_date). - Begränsa eventuellt indata till de senaste datumen — en aktuell svit kan inte innehålla data som är äldre än svitens egen längd, så ett rullande fönster på exempelvis de senaste 400 dagarna räcker gott.
- Materialisera data per dag i en svittabell om den läses mycket ofta.
Snabb kontroll
Bekräfta att ni förstår förankringen i nuet.
Sammanfattning
Så här beräknar ni den aktuella aktiva sviten i dag:
- Bygg öar med ankaret
login_date - ROW_NUMBER(). - Välj varje användares senaste ö genom det högsta värdet på
streak_end. - Returnera dess längd endast om
streak_endär i dag (eller i går vid respit), annars 0. - Använd LEFT JOIN mot users för inaktiva konton och hantera tidszoner innan ni trunkerar till ett datum.
Ni behärskar nu hela verktygslådan för svitanalys: att hitta följder, längsta svit, villkor med N på varandra följande rader och den aktiva sviten.
Lär dig Förberedelse inför kodningsintervjuer med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 90
- Lektioner
- 360
Vanliga frågor
Är lektionen ”Aktuell aktiv svit per idag” gratis?
Ja – hela texten till ”Aktuell aktiv svit per idag” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Vad lär jag mig i ”Aktuell aktiv svit per idag”?
Beräkna en pågående svit och återställ den när den bryts. Ni övar på Förberedelse inför kodningsintervjuer med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelse inför kodningsintervjuer?
Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Aktuell aktiv svit per idag”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelse inför kodningsintervjuer-lektionen?
Ja. Varje Förberedelse inför kodningsintervjuer-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Identifiera sammanhängande kalenderdagar
- Längsta svit per användare
- N på varandra följande rader som uppfyller ett villkor
- Aktuell aktiv svit per idag