0Pricing
SQL Interview Prep · Ders

Bugün İtibarıyla Devam Eden Seri

Devam eden bir serinin hesaplanması ve kesintide sıfırlanması.

Bugün İtibarıyla Devam Eden Seri, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Ürün Sorusu

Seri özellikleri (Duolingo veya Snapchat'i düşünün) geçmişteki en uzun seriyi değil, mevcut seriyi gerektirir. Mülakat sorusu şöyledir: "Her kullanıcı için bugün sona eren kaç ardışık gün boyunca etkin olmuş? Bugünü kaçırdıysa seriyi 0'a sıfırlayın."

Burada bir incelik eklenir: Seri bugüne (veya bir tolerans kuralında düne) dayalı olmalıdır. Bunu, zaten bildiğiniz boşluklar ve adalar temeli üzerine kuralım.

Etkinliği Tanımlama

Önce kuralları görüşmecinizle netleştirin — bu kararlar sorguyu değiştirir:

  • Seri için etkinliğin bugün gerçekleşmesi mi gerekir, yoksa dün kabul edilebilir mi (tolerans süresi)?
  • Gün başına birden çok olay tek bir güne indirgeniyor mu?
  • Bir "günü" hangi saat dilimi tanımlar?

Etkin gün başına bir satır olduğunu ve seri bugün OR dün gününü içeriyorsa güncel sayıldığını varsayacağız.

Adaları Yeniden Oluşturma

Çapayı yeniden kullanın: Her kullanıcının günlerini tarihe göre numaralandırın ve çıkarma işlemi yapın. Her ardışık seri aynı çapanın değerini paylaşır. Mevcut seri, son günü bugün veya dün olan adadı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;

En Son Adanın Belirlenmesi

Her kullanıcının en yakın tarihli adası, en büyük streak_end değerine sahip olandır. Bu bitiş tarihinin serinin devam ediyor sayılacağı kadar yakın olup olmadığını sınarız.

CURRENT_DATE bugünü verir. CURRENT_DATE - 1 dündür. streak_end bu iki değerden birine eşitse seri aktiftir.

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;

Güncellik Sınamasını Uygulama

Şimdi en son adanın etkin olup olmadığını sınayın. Bitiş tarihi bugün veya dünse mevcut seri, adanın uzunluğuna eşittir; aksi hâlde kullanıcı serisini bozmuştur ve mevcut değer 0'dır.

SELECT user_id,
  CASE
    WHEN streak_end >= CURRENT_DATE - 1
    THEN streak_len
    ELSE 0
  END AS current_streak
FROM latest
WHERE rn2 = 1;

Mevcut Seri İçin Tam Sorgu

Tüm katmanları bir araya getirin: numaralandırın, adaları oluşturun, kullanıcı başına en son adayı seçin ve ardından güncellik CASE ifadesini uygulayın. Eksiksiz yanıt budur.

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;

Yalnızca Bugün Geçerliliği

İş kuralı katıysa — seri yalnızca kullanıcı bugün etkin olduysa devam ediyorsa — karşılaştırmayı streak_end = CURRENT_DATE koşulunu gerektirecek şekilde değiştirin.

Tolerans süresi sürümü (>= CURRENT_DATE - 1) daha esnektir ve günün henüz bitmediği gerçek uygulamalarda yaygındır. Görüşmecinin hangisini istediğini her zaman netleştirin.

CASE WHEN streak_end = CURRENT_DATE
     THEN streak_len ELSE 0 END AS current_streak

Alternatif: Geriye Doğru İlerleme

Bazı görüşmecilerin tercih ettiği farklı bir zihinsel model şudur: Her gün ile bugün arasındaki aralığı hesaplayın. Bir gün, o günden bugüne kadar olan her gün mevcutsa mevcut serinin parçasıdır. Başka bir deyişle, login_date ile CURRENT_DATE - (offset from the latest) değerini karşılaştırın.

Ada yöntemi genellikle daha temizdir, ancak bir alternatifi bilmek konuya hâkimiyetinizi gösterir. Temel fikir aynıdır: bugüne dayalı kesintisiz bir zincir.

Etkin Olmayan Kullanıcıları Dahil Etme

logins tablosunda bulunmayan kullanıcıların adası yoktur ve bu kullanıcılar sonuçtan çıkar. Her kullanıcı için bir seri (muhtemelen 0) döndürülmesi gerekiyorsa, kullanıcı listesini LEFT JOIN ile birleştirin ve sonucu COALESCE ile 0'a dönüştürün.

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;

Saat Dilimi Tuzakları

Etkinlik zaman damgaları olarak saklanıyorsa "bugün" saat dilimine bağlıdır. Tarihe dönüştürmeden önce saat dilimini çevirin.

  • UTC olarak saklayıp karşılaştırın veya önce kullanıcının yerel saat dilimine çevirin.
  • Postgres'te event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tz kullanın, ardından tarihe dönüştürün.
  • UTC zaman damgasına doğrudan uygulanan ::date, akşam gerçekleşen bir olayı yanlış takvim gününe yerleştirebilir.

Bundan söz etmek, klasik bir püf noktasıyla ilgili takip sorusunu önceden karşılar.

SELECT user_id,
  (event_ts AT TIME ZONE 'UTC'
             AT TIME ZONE 'America/New_York')::date AS local_day
FROM events;

Performans ve Sonuç

Sık yenilenen panolar için bu sorgu, kullanıcı başına tek geçişte çalışır. Hızını korumak için:

  • (user_id, login_date) üzerinde dizin oluşturun.
  • İsteğe bağlı olarak girdiyi yakın tarihlerle sınırlandırın — mevcut bir seri, kendi uzunluğundan daha eski verileri içeremez; bu nedenle örneğin son 400 günü kapsayan kayan bir pencere yeterlidir.
  • Çok sık okunuyorsa günlük verileri bir seri tablosunda önceden oluşturup saklayın.

Hızlı Kontrol

Çapanın "şimdi"ye nasıl bağlandığını anladığınızı doğrulayın.

Özet

Bugün itibarıyla mevcut etkinlik serisini hesaplamak için:

  • login_date - ROW_NUMBER() çapasıyla adalar oluşturun.
  • Her kullanıcının en son adasını en büyük streak_end değerine göre seçin.
  • Uzunluğunu yalnızca streak_end bugüne (veya tolerans için düne) eşitse döndürün; aksi hâlde 0 döndürün.
  • Etkin olmayan hesaplar için users tablosunu LEFT JOIN ile birleştirin; tarihe dönüştürmeden önce saat dilimlerini işleyin.

Artık seri analizi araç setinin tamamına hâkimsiniz: serileri, en uzun seriyi, N ardışık koşulu ve devam eden seriyi tespit edebilirsiniz.

Sıkça Sorulan Sorular

“Bugün İtibarıyla Devam Eden Seri” dersi ücretsiz mi?

Evet — “Bugün İtibarıyla Devam Eden Seri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“Bugün İtibarıyla Devam Eden Seri” dersinde ne öğreneceğim?

Devam eden bir serinin hesaplanması ve kesintide sıfırlanması. SQL Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Bugün İtibarıyla Devam Eden Seri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Ardışık Takvim Günlerini Tespit Etme
  2. Kullanıcı Başına En Uzun Seri
  3. Koşulu Sağlayan N Ardışık Satır
  4. Bugün İtibarıyla Devam Eden Seri
← SQL Interview Prep Sayfasına Dön