เหตุการณ์ตามลำดับและช่วงเวลา
ตรวจสอบให้ขั้นตอนต่าง ๆ เกิดขึ้นตามลำดับและภายในเวลาที่กำหนดด้วยฟังก์ชันหน้าต่าง
เหตุการณ์ตามลำดับและช่วงเวลา เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดลำดับและเวลาจึงสำคัญ
กรวยการเปลี่ยนผ่านพื้นฐานจากบทเรียนก่อนหน้าตรวจสอบเพียงว่า ผู้ใช้ทำแต่ละขั้นตอน หรือไม่ ผู้สัมภาษณ์ที่ต้องการความละเอียดมากขึ้นจะถามว่า ขั้นตอนต่าง ๆ เกิดขึ้น ตามลำดับที่ถูกต้อง และ ภายในเวลาที่เหมาะสม หรือไม่
ผู้ใช้ที่ซื้อสินค้าในวันจันทร์แล้วเข้าชมหน้าการตลาดในวันศุกร์ไม่ได้เปลี่ยนผ่านตามกรวยการเปลี่ยนผ่านของคุณ ลำดับเหตุการณ์และเวลาจะเปลี่ยนกรวยที่ใช้ตัวบ่งชี้แบบง่ายให้เป็นกรวยที่น่าเชื่อถือ
แนวคิดเรื่องจุดเวลาครั้งแรกต่อผู้ใช้
เพื่อวิเคราะห์ลำดับ ให้บันทึก เวลาครั้งแรก ที่ผู้ใช้แต่ละคนไปถึงแต่ละขั้นตอน การเข้าชมครั้งแรก การสมัครใช้งานครั้งแรก และการซื้อครั้งแรก
จากนั้นการเปลี่ยนผ่านที่ถูกต้องหมายถึง first_signup_time >= first_visit_time และเงื่อนไขต่อเนื่องในลักษณะเดียวกัน MIN(event_time) ที่จัดกลุ่มตามขั้นตอนจะให้จุดอ้างอิงเหล่านี้
SELECT
user_id,
MIN(CASE WHEN event_name = 'visit' THEN event_time END) AS first_visit,
MIN(CASE WHEN event_name = 'signup' THEN event_time END) AS first_signup,
MIN(CASE WHEN event_name = 'purchase' THEN event_time END) AS first_purchase
FROM events
GROUP BY user_id;กำหนดให้ขั้นตอนเกิดขึ้นตามลำดับ
เมื่อมีจุดเวลาครั้งแรกของแต่ละขั้นตอน การบังคับใช้ลำดับก็เป็นเพียงการเปรียบเทียบ ผู้ใช้จะเปลี่ยนผ่านไปยังขั้นตอนที่ 3 ได้จริงก็ต่อเมื่อจุดเวลาทุกจุดไม่เป็นค่าว่างและเพิ่มขึ้นตามลำดับ
สังเกตว่าจุดเวลา NULL ซึ่งหมายถึงขั้นตอนนั้นไม่เคยเกิดขึ้น จะไม่ผ่านการเปรียบเทียบโดยอัตโนมัติ ซึ่งตรงกับสิ่งที่คุณต้องการ
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS visit_t,
MIN(CASE WHEN event_name='signup' THEN event_time END) AS signup_t,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
FROM events GROUP BY user_id
)
SELECT COUNT(*) AS converted_in_order
FROM t
WHERE visit_t IS NOT NULL
AND signup_t >= visit_t
AND purchase_t >= signup_t;เพิ่มช่วงเวลาที่กำหนด
กรวยการเปลี่ยนผ่านส่วนใหญ่มีเส้นตาย เช่น "เปลี่ยนผ่านภายใน 7 วันนับจากการเข้าชมครั้งแรก" ให้เพิ่มขอบเขตช่วงเวลาระหว่างขั้นตอนแรกกับขั้นตอนสุดท้าย
การคำนวณวันที่จะแตกต่างกันตามรูปแบบภาษา ในโพสต์เกรส คุณเขียน visit_t + INTERVAL '7 days' ได้ ส่วนใน MySQL ให้ใช้ DATE_ADD(visit_t, INTERVAL 7 DAY) ควรระบุรูปแบบภาษาที่ใช้เสมอ
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS visit_t,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
FROM events GROUP BY user_id
)
SELECT COUNT(*) AS purchased_within_7d
FROM t
WHERE purchase_t >= visit_t
AND purchase_t < visit_t + INTERVAL '7 days';เหตุใดจึงใช้จุดเวลาครั้งแรกแทนจุดเวลาใดก็ได้
ประเด็นละเอียดในการสัมภาษณ์คือ ช่วงเวลาควรเริ่มจากการเข้าชม ครั้งแรก ของผู้ใช้ หรือจากการเข้าชม ครั้งล่าสุด ก่อนสมัครใช้งาน คำตอบขึ้นอยู่กับคำถามด้านผลิตภัณฑ์
- ช่วงเวลาจาก จุดสัมผัสแรก ใช้วัดระยะเวลาตั้งแต่ความสนใจครั้งแรกจนถึงการเปลี่ยนผ่าน
- ช่วงเวลาจาก จุดสัมผัสล่าสุด ใช้วัดช่วงเร่งการเปลี่ยนผ่านหลังการเข้าชมครั้งสุดท้าย
ถามผู้สัมภาษณ์ว่าหมายถึงแบบใด การเลือกอย่างมีเหตุผลแสดงให้เห็นถึงประสบการณ์ระดับอาวุโส
เหตุการณ์ตามลำดับด้วย LEAD
สำหรับเส้นทางหลายขั้นตอนที่ซับซ้อน ฟังก์ชันหน้าต่างมีประโยชน์มาก เรียงเหตุการณ์ของผู้ใช้แต่ละคนตามเวลา แล้วใช้ LEAD เพื่อดูเหตุการณ์ถัดไปและยืนยันว่าเป็นขั้นตอนถัดไปที่คาดไว้
วิธีนี้รองรับเส้นทางที่มีเหตุการณ์อื่นซึ่งไม่เกี่ยวข้องแทรกอยู่ระหว่างขั้นตอน
SELECT
user_id,
event_name,
event_time,
LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event,
LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events;จับคู่กับขั้นตอนถัดไปที่คาดไว้
ต่อยอดจาก LEAD โดยเก็บแถวที่การ 'เข้าชม' ตามด้วยการ 'สมัครใช้งาน' ทันที วิธีนี้ค้นหาการเปลี่ยนผ่านตามลำดับที่เกิดขึ้นจริง ไม่ใช่เพียงการปรากฏร่วมกัน
คุณสามารถต่อเงื่อนไขตรวจสอบการเปลี่ยนผ่านเหล่านี้เพื่อยืนยันเส้นทางทั้งหมดตามลำดับทีละขั้นตอนได้
WITH seq AS (
SELECT user_id, event_name, event_time,
LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event
FROM events
)
SELECT COUNT(DISTINCT user_id) AS visit_then_signup
FROM seq
WHERE event_name = 'visit' AND next_event = 'signup';เวลาระหว่างขั้นตอนที่ต่อเนื่องกัน
ผู้สัมภาษณ์ชอบถามว่า "แต่ละขั้นตอนใช้เวลานานเท่าไร" ใช้ LEAD กับจุดเวลาแล้วนำมาลบกัน ความแตกต่างระหว่างเหตุการณ์ที่ต่อเนื่องกันคือเวลาที่ผู้ใช้อยู่ในขั้นตอนนั้น
รวมค่ามัธยฐานหรือค่าเฉลี่ยของแต่ละการเปลี่ยนผ่าน เพื่อค้นหาขั้นตอนของกรวยการเปลี่ยนผ่านที่ใช้เวลานานที่สุด
WITH seq AS (
SELECT user_id, event_name, event_time,
LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events
)
SELECT
event_name,
AVG(EXTRACT(EPOCH FROM (next_time - event_time)) / 3600.0) AS avg_hours_to_next
FROM seq
WHERE next_time IS NOT NULL
GROUP BY event_name;กรณีขอบของจุดเวลาเดียวกัน
จะเกิดอะไรขึ้นหากเหตุการณ์สองรายการมีค่า event_time ตรงกันทุกประการ ในกรณีนั้น signup_t >= visit_t จะเป็นจริงแม้เหตุการณ์จะเกิดขึ้นพร้อมกัน และการเรียงตามเวลาเพียงอย่างเดียวจะไม่ชัดเจน
- เลือกใช้
>=หรือ>อย่างมีเจตนา และอธิบายเหตุผล - เพิ่มตัวตัดสินกรณีเสมอ เช่น รหัสลำดับเหตุการณ์ใน
ORDER BYเพื่อให้ฟังก์ชันหน้าต่างให้ผลลัพธ์ที่แน่นอน
การกล่าวถึงเรื่องนี้โดยไม่ต้องมีผู้ถามจะสร้างความประทับใจให้ผู้สัมภาษณ์
SELECT user_id, event_name,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_time, event_id) AS step_seq
FROM events;รวมลำดับและช่วงเวลาไว้ในคำสั่งเดียว
นี่คือกรวยการเปลี่ยนผ่านที่เรียงตามลำดับและอยู่ภายในช่วงเวลาที่กำหนดอย่างสมบูรณ์ โดยยึดการเข้าชมครั้งแรกเป็นจุดเริ่มต้น กำหนดให้การเกิดขึ้นครั้งแรกของแต่ละขั้นตอนถัดมาตามหลังขั้นตอนก่อนหน้า และจำกัดเส้นทางทั้งหมดให้อยู่ภายใน 7 วัน
นี่คือคำตอบที่แยกผู้สมัครซึ่งเข้าใจกรวยการเปลี่ยนผ่านออกจากผู้สมัครที่นับเพียงตัวบ่งชี้
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS v,
MIN(CASE WHEN event_name='signup' THEN event_time END) AS s,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS p
FROM events GROUP BY user_id
)
SELECT
COUNT(*) FILTER (WHERE v IS NOT NULL) AS visited,
COUNT(*) FILTER (WHERE s >= v AND s < v + INTERVAL '7 days') AS signed_up,
COUNT(*) FILTER (WHERE s >= v AND p >= s AND p < v + INTERVAL '7 days') AS purchased
FROM t;หมายเหตุระหว่างรูปแบบภาษา
ข้อควรจำสองประการเกี่ยวกับการรองรับหลายรูปแบบภาษาในการเขียนโปรแกรมสด:
FILTER (WHERE ...)ในการรวมค่าเป็นมาตรฐานของ SQL และใช้ได้ในโพสต์เกรส ส่วนใน MySQL หรือระบบรุ่นเก่า ให้ใช้SUM(CASE WHEN ... THEN 1 ELSE 0 END)แทน- ไวยากรณ์ของช่วงเวลาแตกต่างกัน: โพสต์เกรสใช้
+ INTERVAL '7 days'MySQL ใช้DATE_ADD(d, INTERVAL 7 DAY)และเซิร์ฟเวอร์ SQL ใช้DATEADD(day, 7, d)
ระบุสมมติฐานของคุณ แล้วผู้สัมภาษณ์แทบไม่สนใจว่าคุณใช้รูปแบบภาษาใด สิ่งสำคัญคือคุณรู้ว่ารูปแบบเหล่านั้นแตกต่างกัน
ตรวจสอบอย่างรวดเร็ว
คุณต้องนับผู้ใช้ที่ดำเนินการเข้าชม -> สมัครใช้งาน -> ซื้อครบตามลำดับภายใน 7 วันนับจากการเข้าชมครั้งแรก วิธีใดถูกต้อง
สรุป: เหตุการณ์ตามลำดับและช่วงเวลา
ประเด็นสำคัญ:
- บันทึก เวลาประทับครั้งแรกของผู้ใช้ในแต่ละขั้นตอน ด้วย
MIN(CASE ...). - บังคับใช้ลำดับโดยกำหนดให้เวลาของแต่ละขั้นตอน ตั้งแต่เวลาของขั้นตอนก่อนหน้าหรือหลังจากนั้น
- จำกัดเส้นทางด้วย ช่วงเวลา โดยระบุไวยากรณ์ของภาษาที่ใช้
- ใช้
LEAD/LAGเพื่อตรวจสอบการเปลี่ยนผ่านและเวลาที่ใช้ระหว่างขั้นตอน - จัดการ กรณีเวลาประทับเท่ากัน ด้วยตัวตัดสินกรณีเสมอใน
ORDER BY.
ถัดไป: เปลี่ยนจากฟันเนลไปสู่การทดลองและคำนวณเมตริกต่อกลุ่มการทดลอง
คำถามที่พบบ่อย
บทเรียน “เหตุการณ์ตามลำดับและช่วงเวลา” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เหตุการณ์ตามลำดับและช่วงเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เหตุการณ์ตามลำดับและช่วงเวลา”
ตรวจสอบให้ขั้นตอนต่าง ๆ เกิดขึ้นตามลำดับและภายในเวลาที่กำหนดด้วยฟังก์ชันหน้าต่าง คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “เหตุการณ์ตามลำดับและช่วงเวลา” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สร้างกระบวนการ Funnel หลายขั้นตอน
- เหตุการณ์ตามลำดับและช่วงเวลา
- การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด
- ค่าการเพิ่มขึ้น นัยสำคัญ และเกณฑ์ควบคุมใน SQL