การรักษาผู้ใช้ในวันที่ N และแบบเลื่อนต่อเนื่อง
ความแตกต่างระหว่างคำจำกัดความของการรักษาผู้ใช้แบบคลาสสิก แบบเลื่อนต่อเนื่อง และแบบมีขอบเขต
การรักษาผู้ใช้ในวันที่ N และแบบเลื่อนต่อเนื่อง เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุผลที่การคงอยู่มีหลายคำจำกัดความ
ผู้สัมภาษณ์มักไม่พูดเพียงว่า "คำนวณการคงอยู่" คำถามต่อยอดที่สำคัญคือ การคงอยู่แบบใด ข้อมูลชุดเดียวกันให้ตัวเลขที่แตกต่างกันมากได้ ขึ้นอยู่กับคำจำกัดความ
สามรูปแบบที่ต้องรู้จักคือ การคงอยู่ วันที่ N (แบบคลาสสิก) การคงอยู่ แบบต่อเนื่อง (ไม่จำกัดขอบเขต) และการคงอยู่ แบบจำกัดช่วงเวลา การเข้าใจความแตกต่างและถามว่าธุรกิจต้องการแบบใด คือทักษะที่บทเรียนนี้กำลังทดสอบโดยตรง
การคงอยู่วันที่ N (แบบคลาสสิก)
การคงอยู่วันที่ N ถามว่า ผู้ใช้ใช้งานในวันที่ N พอดี หลังจากการดำเนินการครั้งแรกหรือไม่ วันที่ 1 วันที่ 7 และวันที่ 30 เป็นค่าชี้วัดมาตรฐานของแอปมือถือ
คำสำคัญคือ พอดี ผู้ใช้ที่ใช้งานในวันที่ 6 และวันที่ 8 แต่ไม่ได้ใช้งานในวันที่ 7 จะ ไม่ถือว่ายังคงอยู่ในวันที่ 7 ตามคำจำกัดความแบบคลาสสิก ความแม่นยำนี้ทำให้การนับเข้มงวดและเส้นโค้งไม่ราบเรียบ
การคำนวณความแตกต่างของวัน
การคงอยู่วันที่ N ขึ้นอยู่กับ จำนวนวัน ระหว่างการเริ่มต้นของกลุ่มผู้ใช้กับวันที่ใช้งานแต่ละวัน ใน Postgres การลบวันที่สองค่าเข้าด้วยกันจะให้จำนวนวันเป็นจำนวนเต็มโดยตรง
สำหรับภาษาถิ่นอื่น: DATEDIFF(day, start, d) ใน SQL Server และ DATEDIFF(d, start) ใน MySQL ควรระบุภาษาถิ่นที่ใช้ เนื่องจากแนวคิดเรื่องระยะห่างของวันเหมือนกัน
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
หากต้องการอัตราการคงอยู่วันที่ 7 ให้นับผู้ใช้ที่ไม่ซ้ำกันซึ่งมีระยะห่างของวันเท่ากับ 7 แล้วหารด้วยขนาดของกลุ่มผู้ใช้ ใช้การรวมแบบมีเงื่อนไข เพื่อให้ทั้งตัวเศษและตัวส่วนมาจากการอ่านข้อมูลครั้งเดียว
การเปรียบเทียบ = 7 (ไม่ใช่ >= 7) คือเอกลักษณ์ของการคงอยู่แบบคลาสสิก หากเปลี่ยนเป็นตัวดำเนินการเปรียบเทียบแบบไม่เท่ากัน จะเปลี่ยนคำจำกัดความโดยไม่แสดงข้อผิดพลาด
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;การคงอยู่แบบต่อเนื่อง (ไม่จำกัดขอบเขต)
การคงอยู่แบบต่อเนื่อง ในวันที่ N ถามคำถามที่ผ่อนปรนกว่า: ผู้ใช้ใช้งานในวันที่ N หรือวันใดก็ตามหลังจากนั้น หรือไม่ ผู้ใช้จะถูกนับว่ายังคงอยู่ในวันที่ 7 หากกลับมาใช้งานในวันที่ 7 วันที่ 20 หรือวันใดก็ตามหลังจากนั้น
วิธีนี้ให้เส้นโค้งที่ราบเรียบและสูงกว่า และมักเหมาะกับการวัดความผูกพันระยะยาว การเปลี่ยนแปลงสำคัญคือเปลี่ยนจาก = N เป็น >= N กับวันใช้งานสูงสุด
การคงอยู่แบบต่อเนื่องด้วยวัน MAX
วิธีที่ชัดเจนในการคำนวณการคงอยู่แบบต่อเนื่องคือ หาระยะห่างของวันที่ผู้ใช้ใช้งานครั้งสุดท้ายโดยใช้ MAX จากนั้นผู้ใช้จะถือว่ายังคงอยู่แบบต่อเนื่องในวันที่ N หากค่าสูงสุดนั้นมีค่า >= N
หลังจากใช้ MAX ผู้ใช้หนึ่งคนจะเหลือหนึ่งแถว ทำให้การนับเป็นเรื่องง่าย นอกจากนี้ยังทำให้เห็นชัดว่าการคงอยู่แบบต่อเนื่องมีลักษณะไม่ลดลง กล่าวคือ หากยังคงอยู่ในวันที่ 30 ก็จะยังคงอยู่ในทุกค่า N ที่น้อยกว่า
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;การคงอยู่แบบจำกัดช่วงเวลา
ทางเลือกตรงกลางคือ การคงอยู่แบบจำกัดขอบเขต ซึ่งหมายถึงการใช้งานอย่างน้อยหนึ่งครั้งภายใน ช่วงเวลา รอบวันที่ N เช่น วันที่ 5 ถึง 9 สำหรับค่าชี้วัด "สัปดาห์ที่ 1" วิธีนี้ยอมรับผู้ใช้ที่ไม่ได้ใช้งานในวันนั้นพอดี แต่ให้ความราบเรียบน้อยกว่าการคงอยู่แบบต่อเนื่องอย่างเต็มรูปแบบ
คำจำกัดความนี้สอดคล้องกับธุรกิจในโลกจริงมากที่สุด เนื่องจากการใช้งานจริงมักเกิดเป็นช่วง ๆ คำสั่งจะใช้ BETWEEN กับระยะห่างของวัน
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;คำจำกัดความสามแบบ ผู้ใช้คนเดียวกัน
ลองทำให้ความแตกต่างเห็นได้ชัด ผู้ใช้เริ่มต้นในวันที่ 0 แล้วใช้งานอีกครั้งเพียงวันที่ 9
- แบบคลาสสิก วันที่ 7: ไม่ถือว่ายังคงอยู่ (ไม่มีการใช้งานในวันที่ 7 พอดี)
- แบบต่อเนื่อง วันที่ 7: ถือว่ายังคงอยู่ (วันที่สูงสุดคือวันที่ 9 ซึ่งมีค่า >= 7)
- แบบจำกัดช่วงเวลา 5–9 สัปดาห์ที่ 1: ถือว่ายังคงอยู่ (วันที่ 9 อยู่ในช่วงเวลา)
ข้อมูลเดียวกัน แต่ได้สามคำตอบ ในการสัมภาษณ์ ควรเล่าตัวอย่างหนึ่งในลักษณะนี้เพื่อแสดงว่าคุณเข้าใจความหมาย ไม่ใช่เพียงไวยากรณ์
ความละเอียดของช่วงเวลา: วัน สัปดาห์ และเดือน
แนวคิด "วันที่ N" สามารถขยายเป็น ช่วงเวลาที่ N ได้ สำหรับผลิตภัณฑ์ B2B ที่ใช้งานเป็นรายเดือน การคงอยู่ระดับวันเป็นเพียงสัญญาณรบกวน คุณควรจัดกลุ่มตามเดือนและถามเกี่ยวกับเดือนที่ N กลไกเหมือนกัน ต่างกันเพียงระดับการตัดทอนเท่านั้น
เลือกระดับความละเอียดให้ตรงกับจังหวะการใช้งานตามธรรมชาติของผลิตภัณฑ์ และควรอธิบายเหตุผลด้วย ใช้รายวันสำหรับแอปมือถือผู้บริโภค และใช้รายสัปดาห์หรือรายเดือนสำหรับเครื่องมือ B2B ที่มีการใช้งานช้ากว่า
-- 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;กับดักการอยู่รอดและวุฒิภาวะของข้อมูล
คำถามเชิงลึกสำหรับผู้มีประสบการณ์คือ อย่ารายงานการคงอยู่วันที่ 30 ของกลุ่มผู้ใช้ที่มีอายุเพียง 10 วัน กลุ่มนี้ยังไม่มี โอกาส ที่จะใช้งานในวันที่ 30 ดังนั้นค่าที่ได้จึงเป็น 0 จากการถูกกำหนดอย่างไม่เหมาะสม ไม่ใช่การคงอยู่ที่ต่ำจริง
ป้องกันปัญหานี้โดยรายงานการคงอยู่วันที่ N เฉพาะกลุ่มผู้ใช้ที่มีอายุ >= N เท่านั้น ให้กรองด้วย CURRENT_DATE - day0 >= N หากลืมเรื่องนี้ กลุ่มผู้ใช้ล่าสุดจะดูแย่อย่างรุนแรงเกินจริง
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-30การเลือกคำจำกัดความโดยอธิบายให้ชัดเจน
คำตอบที่ดีที่สุดในการสัมภาษณ์ไม่ใช่คำสั่ง แต่คือการถามกลับว่า "คุณต้องการการคงอยู่แบบคลาสสิกวันที่ N แบบต่อเนื่อง หรือแบบจำกัดช่วงเวลา และช่วงเวลาตามธรรมชาติคืออะไร"
จากนั้นให้อธิบายข้อแลกเปลี่ยน: แบบคลาสสิกเข้มงวดและเหมาะกับจุดกระตุ้นการใช้งานของผลิตภัณฑ์ในวันใดวันหนึ่งโดยเฉพาะ แบบต่อเนื่องประเมินการคงอยู่ระยะสั้นสูงเกินจริง แต่สะท้อนความผูกพันตลอดอายุการใช้งาน ส่วนแบบจำกัดช่วงเวลาคือการประนีประนอมที่สอดคล้องกับความเป็นจริง การแสดงให้เห็นว่าคุณเลือกค่าชี้วัดอย่างมีจุดประสงค์คือประเด็นสำคัญทั้งหมดของบทเรียนนี้
ตรวจสอบอย่างรวดเร็ว
การดำเนินการครั้งแรกของผู้ใช้เกิดขึ้นในวันที่ 0 และกิจกรรมอื่นเพียงครั้งเดียวเกิดขึ้นในวันที่ 12 ตามแต่ละคำจำกัดความ ผู้ใช้รายนี้ถือว่ายังคงอยู่ใน วันที่ 7 หรือไม่
สรุป: คำจำกัดความของการคงอยู่
ประเด็นสำคัญของการคงอยู่วันที่ N และการคงอยู่แบบต่อเนื่อง:
- การคงอยู่วันที่ N แบบคลาสสิก: ใช้งานในวันที่ N พอดี (ระยะห่าง
= N) — เข้มงวดและมีเส้นโค้งไม่ราบเรียบ - การคงอยู่แบบต่อเนื่อง: ใช้งานในวันที่ N หรือหลังจากนั้น (
MAX offset >= N) — ราบเรียบกว่า ไม่ลดลง และใช้วัดความผูกพัน - การคงอยู่แบบจำกัดช่วงเวลา: ใช้งานภายในช่วงเวลา (
BETWEEN) — เป็นการประนีประนอมที่สอดคล้องกับความเป็นจริง - ขยายแนวคิดจากวันไปเป็น ระดับความละเอียดของช่วงเวลา ใด ๆ ที่ตรงกับจังหวะการใช้งานของผลิตภัณฑ์
- รายงานการคงอยู่วันที่ N เฉพาะ กลุ่มผู้ใช้ที่มีอายุถึงเกณฑ์ (อายุ >= N) เพื่อหลีกเลี่ยงกับดักการอยู่รอด และควรถามเสมอว่าธุรกิจหมายถึงคำจำกัดความใด
คำถามที่พบบ่อย
บทเรียน “การรักษาผู้ใช้ในวันที่ N และแบบเลื่อนต่อเนื่อง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การรักษาผู้ใช้ในวันที่ N และแบบเลื่อนต่อเนื่อง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การรักษาผู้ใช้ในวันที่ N และแบบเลื่อนต่อเนื่อง”
ความแตกต่างระหว่างคำจำกัดความของการรักษาผู้ใช้แบบคลาสสิก แบบเลื่อนต่อเนื่อง และแบบมีขอบเขต คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การรักษาผู้ใช้ในวันที่ N และแบบเลื่อนต่อเนื่อง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- กำหนด Cohort จากการกระทำแรก
- สร้างเมทริกซ์การรักษาผู้ใช้
- การรักษาผู้ใช้ในวันที่ N และแบบเลื่อนต่อเนื่อง
- คำสั่งค้นหาการเลิกใช้และการกลับมาใช้งาน