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_streakAlternatif: 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_tzkullanı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_enddeğerine göre seçin. - Uzunluğunu yalnızca
streak_endbugü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
userstablosunuLEFT JOINile 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
- Ardışık Takvim Günlerini Tespit Etme
- Kullanıcı Başına En Uzun Seri
- Koşulu Sağlayan N Ardışık Satır
- Bugün İtibarıyla Devam Eden Seri