Förberedelse inför kodningsintervjuer · Lektion

Aktuell aktiv svit per idag

Beräkna en pågående svit och återställ den när den bryts.

Lektion 4 av 413 steg

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_streak

Ett 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_tz i Postgres och konvertera sedan till datum.
  • En naiv ::date på 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.

Gratis att börja

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

  1. Identifiera sammanhängande kalenderdagar
  2. Längsta svit per användare
  3. N på varandra följande rader som uppfyller ett villkor
  4. Aktuell aktiv svit per idag
← Tillbaka till Förberedelse inför kodningsintervjuer