إنشاء مسار تحويل متعدد الخطوات
حساب المستخدمين الذين يصلون إلى كل خطوة مرتبة وحساب معدلات التحويل بين الخطوات
إنشاء مسار تحويل متعدد الخطوات درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ما الذي يختبره سؤال مسار التحويل فعلًا
عندما يقول لك المحاور "أنشئ لي مسار تحويل للتسجيل"، فهو يختبر قدرتك على عدّ المستخدمين المميزين الذين يصلون إلى كل خطوة مرتبة، والتعبير عن نسبة الانخفاض بينهم.
يتكون مسار التحويل من مراحل مثل visit -> signup -> activate -> purchase. وعادةً ما تكون النتيجة المطلوبة صفًا واحدًا لكل خطوة، يتضمن عدد المستخدمين ومعدل التحويل.
- احسب عدد المستخدمين، لا عدد الأحداث؛ فالمستخدم الذي يطلق حدثًا مرتين يظل مستخدمًا واحدًا.
- الخطوات مرتبة؛ والوصول إلى الخطوة 3 يعني اجتياز الخطوتين 1 و2.
جدول الأحداث الذي سيُعطى لك
في معظم أسئلة مسارات التحويل، سيُعطى لك جدول واحد باسم events وبصيغة طويلة. تخيّل بنيته على النحو التالي:
user_idمنفّذ الإجراءevent_nameمثل 'visit' و'signup' و'purchase'event_timeطابع زمني
يمثل كل صف إجراءً واحدًا. ومهمتك هي إعادة تشكيل هذه البيانات إلى عدد لكل خطوة بالتتابع. احرص دائمًا على تأكيد أسماء الأحداث الدقيقة مع المحاور قبل كتابة SQL.
CREATE TABLE events (
user_id INT,
event_name VARCHAR(50),
event_time TIMESTAMP
);عدّ المستخدمين عند خطوة واحدة
ابدأ بالأساسيات: كم عدد المستخدمين المميزين الذين وصلوا إلى خطوة واحدة؟ استخدم COUNT(DISTINCT user_id) مع ترشيح حسب اسم الحدث.
هذه هي لبنة البناء لكل مسار تحويل. فإذا استطعت عدّ مستخدمي خطوة واحدة بوضوح، فستستطيع عدّ جميع الخطوات.
SELECT COUNT(DISTINCT user_id) AS users_who_signed_up
FROM events
WHERE event_name = 'signup';التجميع الشرطي لجميع الخطوات
تتمثل الإجابة الواضحة في المقابلة في عدّ كل خطوة في مرور واحد باستخدام التجميع الشرطي: وضع CASE داخل COUNT(DISTINCT ...).
لكل خطوة، احسب عدد المستخدمين المميزين الذين يطابق حدثهم تلك الخطوة. قراءة واحدة، وصف واحد لإجماليات الخطوات.
SELECT
COUNT(DISTINCT CASE WHEN event_name = 'visit' THEN user_id END) AS step1_visit,
COUNT(DISTINCT CASE WHEN event_name = 'signup' THEN user_id END) AS step2_signup,
COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN user_id END) AS step3_purchase
FROM events;الخطأ الخفي: الخطوات ليست مرتبة
يحمل الاستعلام الذي رأيته للتو فخًا يحبه المحاورون. فهو يحسب أي شخص نفّذ 'purchase'، حتى لو لم يزر الموقع أو يسجّل في البيانات.
يتطلب مسار التحويل الحقيقي أن تكون كل خطوة لاحقة مجموعة جزئية من الخطوة السابقة. وقد يؤدي عدّ الأحداث بصورة مستقلة إلى أن يكون عدد مستخدمي الخطوة 3 أكبر من عدد مستخدمي الخطوة 2، وهذا مستحيل منطقيًا في مسار تحويل.
الحل هو ربط خطوات كل مستخدم معًا، وذلك عادةً باختزال البيانات أولًا إلى صف واحد لكل مستخدم.
صف واحد لكل مستخدم مع مؤشرات
النمط المتين هو اختزال سجل الأحداث إلى صف واحد لكل مستخدم، مع مؤشر منطقي (على هيئة 0/1) يوضح ما إذا كان قد نفّذ كل خطوة من الخطوات. وتحول MAX(CASE ...) السجل الطويل إلى ملخص عريض لكل مستخدم.
WITH user_steps AS (
SELECT
user_id,
MAX(CASE WHEN event_name = 'visit' THEN 1 ELSE 0 END) AS did_visit,
MAX(CASE WHEN event_name = 'signup' THEN 1 ELSE 0 END) AS did_signup,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS did_purchase
FROM events
GROUP BY user_id
)
SELECT * FROM user_steps;فرض ترتيب الخطوات
نفرض الآن قاعدة مسار التحويل: لا يُحتسب المستخدم في الخطوة N إلا إذا نفّذ كل خطوة تسبقها أيضًا. ولا يُعتد بالوصول إلى 'purchase' إلا إذا كان المستخدم قد زار الموقع وسجّل أيضًا.
اجمع المؤشرات مع ربط شروط المتطلبات السابقة باستخدام AND، بحيث تكون كل خطوة مجموعة جزئية حقيقية من الخطوة السابقة.
WITH user_steps AS (
SELECT
user_id,
MAX(CASE WHEN event_name = 'visit' THEN 1 ELSE 0 END) AS did_visit,
MAX(CASE WHEN event_name = 'signup' THEN 1 ELSE 0 END) AS did_signup,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS did_purchase
FROM events
GROUP BY user_id
)
SELECT
SUM(did_visit) AS step1_visit,
SUM(CASE WHEN did_visit = 1 AND did_signup = 1 THEN 1 ELSE 0 END) AS step2_signup,
SUM(CASE WHEN did_visit = 1 AND did_signup = 1 AND did_purchase = 1 THEN 1 ELSE 0 END) AS step3_purchase
FROM user_steps;تحويل الأعداد إلى نتيجة طويلة ومنظمة
غالبًا ما يفضّل المحاورون صفًا واحدًا لكل خطوة بدلًا من صف عريض واحد. حوّل الإجماليات العريضة إلى صيغة طويلة باستخدام UNION ALL صغير، وأرفق رقم الخطوة لترتيبها.
يسهّل ذلك كثيرًا حساب معدلات التحويل وإنشاء الرسوم البيانية في الخطوة التالية.
WITH funnel AS (
SELECT 1 AS step_no, 'visit' AS step_name, 1000 AS users UNION ALL
SELECT 2, 'signup', 420 UNION ALL
SELECT 3, 'purchase', 95
)
SELECT step_no, step_name, users
FROM funnel
ORDER BY step_no;معدل التحويل من خطوة إلى أخرى
هناك معدلان مهمان، وسيسألك المحاور أيّهما تقصد:
- تحويل الخطوة: عدد المستخدمين عند هذه الخطوة مقسومًا على عدد المستخدمين عند الخطوة السابقة.
- التحويل الإجمالي: عدد المستخدمين عند هذه الخطوة مقسومًا على عدد المستخدمين عند بداية مسار التحويل.
استخدم LAG لجلب عدد المستخدمين في الخطوة السابقة لحساب معدل التحويل من خطوة إلى أخرى. وحوّل القيمة إلى عدد عشري حتى لا تحصل على قسمة صحيحة.
WITH funnel AS (
SELECT 1 AS step_no, 'visit' AS step_name, 1000 AS users UNION ALL
SELECT 2, 'signup', 420 UNION ALL
SELECT 3, 'purchase', 95
)
SELECT
step_name,
users,
ROUND(100.0 * users / LAG(users) OVER (ORDER BY step_no), 1) AS step_conv_pct
FROM funnel
ORDER BY step_no;التحويل الإجمالي من البداية
لحساب التحويل الإجمالي، اقسم عدد المستخدمين في كل خطوة على عدد المستخدمين في الخطوة الأولى. وتثبّت FIRST_VALUE، مع تطبيق الترتيب على مسار التحويل، ذلك العدد الأول لكل صف.
اذكر دائمًا للمحاور أنك عالجت مشكلة القسمة الصحيحة بضرب القيمة في 100.0.
WITH funnel AS (
SELECT 1 AS step_no, 'visit' AS step_name, 1000 AS users UNION ALL
SELECT 2, 'signup', 420 UNION ALL
SELECT 3, 'purchase', 95
)
SELECT
step_name,
users,
ROUND(100.0 * users / FIRST_VALUE(users) OVER (ORDER BY step_no), 1) AS overall_pct
FROM funnel
ORDER BY step_no;تجميع مسار التحويل كاملًا
إليك الإجابة الشاملة التي يريدها المحاورون: اختزل البيانات إلى مؤشرات لكل مستخدم، ثم افرض الترتيب، وحوّلها إلى صيغة طويلة، وبعد ذلك احسب المعدلين. اشرح الخطوات بصوت مسموع، موضحًا الغرض من كل CTE.
يتسع هذا الهيكل بسهولة: أضف خطوة بإضافة مؤشر واحد وصف واحد من UNION ALL.
WITH user_steps AS (
SELECT user_id,
MAX(CASE WHEN event_name = 'visit' THEN 1 ELSE 0 END) AS s1,
MAX(CASE WHEN event_name = 'signup' THEN 1 ELSE 0 END) AS s2,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS s3
FROM events GROUP BY user_id
),
totals AS (
SELECT 1 AS step_no, 'visit' AS step_name, SUM(s1) AS users FROM user_steps UNION ALL
SELECT 2, 'signup', SUM(CASE WHEN s1=1 AND s2=1 THEN 1 ELSE 0 END) FROM user_steps UNION ALL
SELECT 3, 'purchase', SUM(CASE WHEN s1=1 AND s2=1 AND s3=1 THEN 1 ELSE 0 END) FROM user_steps
)
SELECT step_name, users,
ROUND(100.0 * users / LAG(users) OVER (ORDER BY step_no), 1) AS step_pct
FROM totals ORDER BY step_no;تحقق سريع
لاحظ المحاور أن مسار التحويل لديك يعرض 95 مستخدمًا عند 'purchase'، لكنه يعرض 80 مستخدمًا فقط عند 'signup'. ما السبب الأكثر احتمالًا؟
مراجعة: مسارات التحويل متعددة الخطوات
يمكنك الآن إنشاء مسار تحويل بالطريقة المتوقعة في المقابلات:
- احسب المستخدمين المميزين لكل خطوة مرتبة، ولا تحسب الأحداث الخام أبدًا.
- اختزل سجل الأحداث إلى صف واحد لكل مستخدم باستخدام مؤشرات
MAX(CASE ...). - افرض الترتيب بحيث تكون كل خطوة مجموعة جزئية من الخطوة السابقة.
- احسب التحويل من خطوة إلى أخرى (LAG) والإجمالي (FIRST_VALUE)، مع معالجة القسمة الصحيحة.
التالي: التأكد من أن هذه الخطوات حدثت فعلًا بالترتيب الصحيح وضمن إطار زمني.
الأسئلة الشائعة
هل درس «إنشاء مسار تحويل متعدد الخطوات» مجاني؟
نعم — نص درس «إنشاء مسار تحويل متعدد الخطوات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء مسار تحويل متعدد الخطوات»؟
حساب المستخدمين الذين يصلون إلى كل خطوة مرتبة وحساب معدلات التحويل بين الخطوات تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «إنشاء مسار تحويل متعدد الخطوات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء مسار تحويل متعدد الخطوات
- الأحداث المرتبة والنوافذ الزمنية
- إسناد اختبارات A/B ومقاييسها
- التحسن والدلالة والضوابط في SQL