تقرير تحليل الأتراب - نشاط المستخدمين الشهري حسب المنشورات والحلول

هذا هو إصدار SQL لتقرير تحليل الفوج لنشاط المستخدم، للاستخدام ضمن المكون الإضافي Data Explorer.

:discourse: يتطلب هذا التقرير تمكين المكون الإضافي Discourse Solved .

يقدم تقرير تحليل الفوج هذا رؤى حول تفاعل المستخدم من خلال تتبع نشاط المستخدمين الذين سجلوا منذ تاريخ بدء محدد. يركز بشكل خاص على المستخدمين الذين يستوفون أو يتجاوزون عتبات معينة للمشاركات التي تم إنشاؤها والحلول المقدمة كل شهر بعد تسجيلهم.

هذا التقرير قيم للمسؤولين الذين يتطلعون إلى فهم فعالية مجتمعهم في الاحتفاظ بالمستخدمين الجدد وإشراكهم بمرور الوقت، خاصة فيما يتعلق بالنشر وتقديم الحلول للمواضيع. يمكن أن يكون هذا التقرير مفيدًا أيضًا لتقييم صحة المجتمع وتحديد فعالية استراتيجيات نمو المجتمع.

المستخدمون النشطون شهريًا بعد التسجيل مع الحد الأدنى من معلمات المشاركات + الحلول

--[params]
-- date :start_date = 2023-01-01
-- int :min_posts_per_month = 1
-- int :min_solutions_per_month = 1

WITH user_cohorts AS (
    SELECT
        id AS user_id,
        DATE_TRUNC('month', created_at) AS cohort,
        COUNT(id) OVER (PARTITION BY DATE_TRUNC('month', created_at)) AS users_signed_up
    FROM users
    WHERE created_at >= :start_date
),
posts_activity AS (
    SELECT
        p.user_id,
        EXTRACT(YEAR FROM AGE(p.created_at, u.created_at)) * 12 + EXTRACT(MONTH FROM AGE(p.created_at, u.created_at)) AS months_after_registration,
        DATE_TRUNC('month', u.created_at) AS cohort
    FROM posts p
    JOIN users u ON p.user_id = u.id
    WHERE p.created_at >= u.created_at
),
solutions_counts AS (
    SELECT
        p.user_id,
        COUNT(p.user_id) as solutions_count,
        EXTRACT(YEAR FROM AGE(p.created_at, u.created_at)) * 12 + EXTRACT(MONTH FROM AGE(p.created_at, u.created_at)) AS months_after_registration,
        DATE_TRUNC('month', u.created_at) AS cohort
    FROM discourse_solved_solved_topics dsst
    INNER JOIN posts p ON p.id = dsst.answer_post_id
    JOIN topics t ON t.id = p.topic_id
    JOIN users u ON p.user_id = u.id
    WHERE p.created_at >= u.created_at
    GROUP BY months_after_registration, cohort, p.user_id
    HAVING COUNT(p.user_id) >= :min_solutions_per_month
),
activity_counts AS (
    SELECT
        cohort,
        months_after_registration,
        COUNT(user_id) AS posts_count,
        user_id
    FROM posts_activity
    GROUP BY cohort, months_after_registration, user_id
    HAVING COUNT(user_id) >= :min_posts_per_month
),
active_users AS (
    SELECT
        sc.cohort,
        sc.months_after_registration,
        COUNT(DISTINCT ac.user_id) AS active_users
    FROM solutions_counts sc
    FULL JOIN activity_counts ac ON sc.user_id = ac.user_id
    AND sc.months_after_registration = ac.months_after_registration
    AND sc.cohort = ac.cohort
    GROUP BY sc.cohort, sc.months_after_registration
),
cohorts_series AS (
    SELECT generate_series AS months_after_registration
    FROM generate_series(0, 11)
),
cohorts AS (
    SELECT
        cohort,
        MAX(users_signed_up) AS users_signed_up
    FROM user_cohorts
    GROUP BY cohort
),
cross_join AS (
    SELECT
        c.cohort,
        c.users_signed_up,
        cs.months_after_registration
    FROM cohorts c
    CROSS JOIN cohorts_series cs
),
final_counts AS (
    SELECT
        cj.cohort,
        cj.users_signed_up,
        cj.months_after_registration,
        COALESCE(au.active_users, 0) AS active_users
    FROM cross_join cj
    LEFT JOIN active_users au ON au.cohort = cj.cohort AND au.months_after_registration = cj.months_after_registration
)
SELECT
    TO_CHAR(cohort, 'Mon YYYY') AS "Joined In", -- Include the year in the Joined In column
    users_signed_up AS "Users Signed Up",
    MAX(CASE WHEN months_after_registration = 0 THEN active_users END) AS "Month 1",
    MAX(CASE WHEN months_after_registration = 1 THEN active_users END) AS "Month 2",
    MAX(CASE WHEN months_after_registration = 2 THEN active_users END) AS "Month 3",
    MAX(CASE WHEN months_after_registration = 3 THEN active_users END) AS "Month 4",
    MAX(CASE WHEN months_after_registration = 4 THEN active_users END) AS "Month 5",
    MAX(CASE WHEN months_after_registration = 5 THEN active_users END) AS "Month 6",
    MAX(CASE WHEN months_after_registration = 6 THEN active_users END) AS "Month 7",
    MAX(CASE WHEN months_after_registration = 7 THEN active_users END) AS "Month 8",
    MAX(CASE WHEN months_after_registration = 8 THEN active_users END) AS "Month 9",
    MAX(CASE WHEN months_after_registration = 9 THEN active_users END) AS "Month 10",
    MAX(CASE WHEN months_after_registration = 10 THEN active_users END) AS "Month 11",
    MAX(CASE WHEN months_after_registration = 11 THEN active_users END) AS "Month 12"
FROM final_counts
GROUP BY cohort, users_signed_up
ORDER BY cohort

شرح استعلام SQL

المعلمات

يستخدم هذا التقرير ثلاث معلمات:

  • start_date: التاريخ الذي سيتم البدء منه في تتبع تسجيلات المستخدمين الجدد.
  • min_posts_per_month: الحد الأدنى لعدد المشاركات التي يجب على المستخدم إنشاؤها في شهر واحد ليتم اعتباره نشطًا.
  • min_solutions_per_month: الحد الأدنى لعدد الحلول (الإجابات المقبولة) التي يجب على المستخدم تقديمها في شهر واحد ليتم اعتباره نشطًا.

يجب على المستخدمين استيفاء كل من متطلبات min_posts_per_month و min_solutions_per_month ليتم اعتبارهم نشطين لهذا الشهر.

تعبيرات الجدول المشتركة (CTEs)

يستخدم استعلام SQL المقدم العديد من تعبيرات الجدول المشتركة (CTEs) لتقسيم عملية حساب المستخدمين النشطين شهريًا بعد التسجيل، بناءً على معايير الحد الأدنى للمشاركات والحلول. إليك شرح لكل CTE:

user_cohorts

يحدد هذا CTE مجموعات المستخدمين بناءً على شهر تسجيلهم. لكل مستخدم، يقوم بحساب شهر تسجيله (cohort) ويحسب العدد الإجمالي للمستخدمين الذين سجلوا في نفس الشهر. يساعد هذا في فهم الحجم الأولي لكل مجموعة.

posts_activity

يتتبع هذا CTE نشاط المستخدمين من حيث المشاركات التي تم إجراؤها بعد تسجيلهم. لكل مشاركة، يقوم بحساب عدد الأشهر التي مرت منذ تاريخ تسجيل المستخدم (months_after_registration) ويقوم بتجميعها حسب مجموعة تسجيل المستخدم. يُستخدم هذا لتتبع مدى نشاط المستخدمين من حيث نشر المحتوى بمرور الوقت.

solutions_counts

يركز هذا CTE على حساب الحلول (الإجابات المقبولة) التي قدمها المستخدمون. يقوم بتصفية المشاركات التي تم تمييزها كحلول ويحسبها لكل مستخدم، مع التأكد من أن المشاركات التي تم إجراؤها بعد تسجيل المستخدم فقط هي التي تم أخذها في الاعتبار. كما يقوم بحساب عدد الأشهر التي مرت منذ تسجيل المستخدم لكل حل. يتم تضمين المستخدمين في هذا العدد فقط إذا استوفوا أو تجاوزوا الحد الأدنى المحدد لعدد الحلول شهريًا.

activity_counts

يقوم هذا CTE بتجميع عدد المشاركات التي أجراها كل مستخدم شهريًا بعد التسجيل. يقوم بتجميع المستخدمين حسب مجموعة تسجيلهم وعدد الأشهر منذ التسجيل، ثم يحسب عدد المشاركات التي تم إجراؤها. يتم تضمين المستخدمين الذين يستوفون أو يتجاوزون الحد الأدنى المحدد لعدد المشاركات شهريًا فقط في هذا العدد.

active_users

يجمع هذا CTE البيانات من solutions_counts و activity_counts لتحديد المستخدمين النشطين - أولئك الذين يستوفون معايير المشاركات والحلول. يقوم بحساب المستخدمين المميزين النشطين بناءً على المعايير المحددة للمشاركات والحلول، مجمعة حسب مجموعة تسجيلهم وعدد الأشهر منذ التسجيل.

cohorts_series

ينشئ هذا CTE سلسلة من الأرقام من 0 إلى 11، تمثل عدد الأشهر بعد التسجيل. يُستخدم هذا لضمان أن التقرير النهائي يتضمن بيانات لكل شهر حتى 12 شهرًا، حتى لو لم يكن هناك مستخدمون نشطون في بعض الأشهر.

cohorts

يقوم هذا CTE بتجميع البيانات من user_cohorts للحصول على العدد الإجمالي للمستخدمين الذين سجلوا في كل مجموعة. يضمن أن التقرير النهائي يتضمن العدد الإجمالي للمستخدمين المسجلين لكل مجموعة.

cross_join

يقوم هذا CTE بإجراء ربط متقاطع بين CTE cohorts و CTE cohorts_series. يضمن هذا تمثيل كل مجموعة لكل شهر بعد التسجيل، مما يسهل حساب المستخدمين النشطين لكل شهر في الخطوة النهائية.

final_counts

يجمع هذا CTE جميع CTEs السابقة لحساب الأعداد النهائية للمستخدمين النشطين لكل شهر بعد التسجيل، لكل مجموعة. يستخدم ربطًا أيسر لمطابقة المستخدمين النشطين من CTE active_users مع المجموعات والأشهر التي تم إنشاؤها في CTE cross_join. يضمن أن كل زوج من مجموعة-شهر لديه عدد من المستخدمين النشطين، مع افتراض القيمة 0 إذا لم يكن هناك مستخدمون نشطون لهذا الزوج.

SELECT النهائي

تقوم عبارة SELECT النهائية في الاستعلام بتجميع المستخدمين في مجموعات بناءً على شهر وسنة تسجيلهم، ثم تحسب عدد المستخدمين النشطين لكل شهر حتى عام واحد بعد التسجيل. يتم ذلك من خلال مزيج من التحويلات والتجميعات الشرطية، التي تقوم بتحويل البيانات إلى تنسيق حيث يمثل كل صف مجموعة، ويمثل كل عمود عدد المستخدمين النشطين لكل شهر بعد التسجيل، من “الشهر 1” إلى “الشهر 12”.

النتائج

يقدم التقرير جدولًا بالأعمدة التالية:

  • Joined In: شهر وسنة المجموعة (وقت تسجيل المستخدمين).
  • Users Signed Up: العدد الإجمالي للمستخدمين الذين سجلوا في تلك المجموعة.
  • Month 1 to Month 12: عدد المستخدمين النشطين لكل شهر بعد التسجيل، حتى 12 شهرًا.

نتائج مثال

Joined In Users Signed Up Month 1 Month 2 Month 3 Month 4 Month 5 Month 6 Month 7 Month 8 Month 9 Month 10 Month 11 Month 12
Jan 2023 50 40 8 4 3 3 3 4 3 2 1 1 4
Feb 2023 63 40 7 5 3 2 2 7 2 2 2 1 1

ستخرج النتائج الكاملة من التقرير بيانات لمدة عام واحد بعد start_date.

6 إعجابات