N. Gün ve Hareketli Elde Tutma
Klasik, hareketli ve sınırlı elde tutma tanımları arasındaki fark.
N. Gün ve Hareketli Elde Tutma, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 3. 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.
Elde Tutmanın Birden Çok Tanımı Neden Var
Bir mülakatçı nadiren yalnızca "elde tutmayı hesaplayın" der. Asıl zorlayıcı devam sorusu şudur: hangi elde tutma? Tanıma bağlı olarak aynı veriler çok farklı sayılar üretir.
Bilmeniz gereken üç tanım şunlardır: Day-N (klasik) elde tutma, kayan (sınırsız) elde tutma ve sınırlı pencere elde tutma. Aralarındaki farkı bilmek ve işletmenin hangisini istediğini sormak, sınanan becerinin kendisidir.
Day-N (Klasik) Elde Tutma
Day-N elde tutma şu soruyu sorar: kullanıcı ilk eyleminden tam olarak N gün sonra etkin miydi? 1. Gün, 7. Gün ve 30. Gün, mobil uygulamalardaki temel ölçümlerdir.
Buradaki anahtar sözcük tam olarak ifadesidir. 6. ve 8. günlerde etkin olup 7. gün etkin olmayan bir kullanıcı, klasik tanıma göre 7. Gün elde tutulmuş sayılmaz. Bu kesinlik, sayımı katı ve eğriyi düzensiz hâle getirir.
Gün Farkını Hesaplama
Day-N elde tutma, kohortun başlangıcı ile her etkinlik günü arasındaki gün sayısına dayanır. Postgres'te iki tarihin çıkarılması, doğrudan tamsayı cinsinden gün sayısını verir.
Diğer lehçelerde: SQL Server'da DATEDIFF(day, start, d), MySQL'de DATEDIFF(d, start). Lehçeyi belirtin; kavram, yani gün ofseti, aynıdır.
WITH cohort AS (
SELECT user_id, MIN(event_at::date) AS day0
FROM events GROUP BY user_id
),
act AS (
SELECT DISTINCT user_id, event_at::date AS day
FROM events
)
SELECT c.user_id, (a.day - c.day0) AS day_n
FROM cohort c
JOIN act a ON a.user_id = c.user_id;7. Gün Elde Tutma Sorgusu
7. Gün elde tutma oranını elde etmek için gün ofseti 7'ye eşit olan farklı kullanıcıları sayın ve kohort büyüklüğüne bölün. Hem pay hem paydayı tek bir taramadan elde etmek için koşullu toplulaştırma kullanın.
= 7 eşitliği (>= 7 değil), klasik elde tutmanın ayırt edici özelliğidir. Bir eşitsizlik kullanmak tanımı fark edilmeden değiştirir.
WITH dn AS (
SELECT c.user_id, (a.day - c.day0) AS day_n
FROM cohort c JOIN act a ON a.user_id = c.user_id
)
SELECT
COUNT(DISTINCT CASE WHEN day_n = 7 THEN user_id END) AS d7_retained,
COUNT(DISTINCT user_id) AS cohort_size,
ROUND(100.0 * COUNT(DISTINCT CASE WHEN day_n = 7 THEN user_id END)
/ NULLIF(COUNT(DISTINCT user_id), 0), 1) AS d7_pct
FROM dn;Kayan (Sınırsız) Elde Tutma
Kayan elde tutma, N. günde daha ılımlı bir soru sorar: kullanıcı N. günde veya sonraki herhangi bir günde etkin miydi? Kullanıcı 7. günde, 20. günde veya daha sonraki herhangi bir günde geri döndüyse 7. günde elde tutulmuş sayılır.
Bu yaklaşım daha yumuşak ve daha yüksek bir eğri üretir; uzun vadeli bağlılığı ölçmek için çoğu zaman tercih edilir. Ayırt edici değişiklik, en yüksek etkinlik gününde = N yerine >= N kullanılmasıdır.
MAX Gününü Kullanarak Kayan Elde Tutma
Kayan elde tutmayı hesaplamanın temiz yolu, her kullanıcının son etkin gün ofsetini (MAX) bulmaktır; ardından bu maksimum değer >= N ise kullanıcı N. günde kayan biçimde elde tutulmuş sayılır.
MAX işleminden sonra her kullanıcı bir satıra karşılık geldiğinden sayım basittir. Bu ayrıca kayan elde tutmanın monoton olduğunu açıkça gösterir: 30. günde elde tutulduysanız, daha küçük tüm N değerlerinde de elde tutulmuşsunuzdur.
WITH last_day AS (
SELECT c.user_id, MAX(a.day - c.day0) AS max_day_n
FROM cohort c JOIN act a ON a.user_id = c.user_id
GROUP BY c.user_id
)
SELECT
COUNT(*) AS cohort_size,
COUNT(*) FILTER (WHERE max_day_n >= 7) AS rolling_d7,
ROUND(100.0 * COUNT(*) FILTER (WHERE max_day_n >= 7)
/ NULLIF(COUNT(*), 0), 1) AS rolling_d7_pct
FROM last_day;Sınırlı Pencereli Elde Tutma
Orta yol sınırlı elde tutmadır: N. gün çevresindeki bir pencere içinde, örneğin "1. hafta" ölçümü için 5. ile 9. günler arasında, en az bir kez etkin olma. Bu tanım, tam gününde etkin olmayan kullanıcıları kabul eder; ancak tamamen kayan tanıma göre daha az yumuşatır.
Gerçek kullanım düzensiz aralıklarla gerçekleştiği için, işletme açısından en gerçekçi tanım budur. Sorgu, gün ofseti üzerinde bir BETWEEN kullanır.
SELECT
COUNT(DISTINCT CASE WHEN day_n BETWEEN 5 AND 9
THEN user_id END) AS week1_retained,
COUNT(DISTINCT user_id) AS cohort_size
FROM dn;Üç Tanım, Aynı Kullanıcı
Farkı somutlaştırın. Bir kullanıcı 0. günde başlıyor ve yalnızca 9. günde etkin oluyor.
- Klasik 7. Gün: Elde tutulmadı (tam olarak 7. günde etkinlik yok).
- Kayan 7. Gün: Elde tutuldu (en yüksek gün 9 >= 7).
- Sınırlı 5–9, 1. hafta: Elde tutuldu (9. gün pencerenin içinde).
Aynı veriler, üç yanıt. Bir mülakatta, yalnızca söz dizimini değil anlamı da anladığınızı kanıtlamak için bunun gibi bir örneği açıklayın.
Dönem Ayrıntı Düzeyi: Gün, Hafta ve Ay
"Day-N" kavramı dönem-N biçiminde genellenebilir. Aylık kullanıma sahip bir B2B ürünü için günlük elde tutma gürültüdür; dönemleri aylara ayırıp ay-N hakkında soru sorarsınız. Mekanizma aynıdır, yalnızca kırpma ayrıntı düzeyi değişir.
Ayrıntı düzeyini ürünün doğal kullanım sıklığıyla eşleştirin ve bunu belirtin. Tüketici mobil ürünleri için günlük, daha yavaş kullanılan B2B araçları için haftalık veya aylık.
-- weekly grain: offset in whole weeks
SELECT
c.user_id,
FLOOR((a.day - c.day0) / 7) AS week_n
FROM cohort c
JOIN act a ON a.user_id = c.user_id;Hayatta Kalma ve Olgunluk Tuzağı
İnce bir kıdemli düzey sorgusu: yalnızca 10 günlük olan bir kohort için 30. Gün elde tutma oranını raporlamayın. Bu kohort henüz 30. günde etkin olma fırsatına sahip değildir; dolayısıyla değeri gerçekte düşük bir elde tutmayı değil, yapay olarak 0'ı gösterir.
Day-N raporlanırken yalnızca yaşı >= N olan kohortları dahil ederek koruma sağlayın. CURRENT_DATE - day0 >= N üzerinde filtre uygulayın. Bunu unutmak, yeni kohortların durumunu felaket derecede kötü gösterir.
WITH cohort AS (
SELECT user_id, MIN(event_at::date) AS day0
FROM events GROUP BY user_id
)
SELECT *
FROM cohort
WHERE (CURRENT_DATE - day0) >= 30; -- mature enough for Day-30Bir Tanımı Açıkça Seçme
En iyi mülakat yanıtı bir sorgu değil, karşılığında sorulan bir sorudur: "Klasik Day-N, kayan tanım veya sınırlı bir pencere mi istiyorsunuz? Doğal dönem nedir?"
Ardından ödünleşimi belirtin: klasik tanım katıdır ve tam gün ürün etkileşimleri için uygundur; kayan tanım kısa vadeyi olduğundan iyi gösterir, ancak yaşam boyu bağlılığı yakalar; sınırlı pencere ise gerçekçi bir uzlaşmadır. Ölçümü bilinçli olarak seçtiğinizi göstermek, dersin bütün amacıdır.
Hızlı Kontrol
Bir kullanıcının ilk eylemi 0. gündedir; diğer tek etkinliği 12. gündedir. Her tanıma göre bu kullanıcılar 7. Günde elde tutulmuş sayılır mı?
Özet: Elde Tutma Tanımları
Day-N ve kayan elde tutma için temel çıkarımlar:
- Klasik Day-N: tam olarak N. günde etkin (
= Nofseti) — katı, düzensiz eğri. - Kayan: N. günde veya daha sonra etkin (
MAX offset >= N) — daha yumuşak, monoton, bağlılığı ölçer. - Sınırlı: bir pencere içinde etkin (
BETWEEN) — gerçekçi uzlaşma. - Günü, ürünün kullanım sıklığıyla eşleşen herhangi bir dönem ayrıntı düzeyine genelleyin.
- Hayatta kalma tuzağından kaçınmak için Day-N değerini yalnızca olgun kohortlar (yaş >= N) için raporlayın ve işletmenin hangi tanımı kastettiğini her zaman sorun.
Sıkça Sorulan Sorular
“N. Gün ve Hareketli Elde Tutma” dersi ücretsiz mi?
Evet — “N. Gün ve Hareketli Elde Tutma” 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.
“N. Gün ve Hareketli Elde Tutma” dersinde ne öğreneceğim?
Klasik, hareketli ve sınırlı elde tutma tanımları arasındaki fark. 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 3. dersidir.
“N. Gün ve Hareketli Elde Tutma” 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
- İlk Eyleme Göre Kohort Tanımlama
- Elde Tutma Matrisi Oluşturma
- N. Gün ve Hareketli Elde Tutma
- Kayıp ve Geri Dönüş Sorguları