0Pricing
Coding Interview Prep · บทเรียน

เหตุการณ์ตามลำดับและช่วงเวลา

ตรวจสอบให้ขั้นตอนต่าง ๆ เกิดขึ้นตามลำดับและภายในเวลาที่กำหนดด้วยฟังก์ชันหน้าต่าง

เหตุการณ์ตามลำดับและช่วงเวลา เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สร้างกระบวนการ Funnel หลายขั้นตอน
  2. เหตุการณ์ตามลำดับและช่วงเวลา
  3. การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด
  4. ค่าการเพิ่มขึ้น นัยสำคัญ และเกณฑ์ควบคุมใน SQL
← กลับไปที่ Coding Interview Prep