الأسئلة المحلولة والمواضيع المعينة حاليًا لكل مستخدم شهريًا

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

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

--[params]
-- string :group_name_filter = staff
-- string :date_trunc = month
-- null user_list :user_list
-- boolean :userlist_filter = false
-- date :start_date = 2023-01-01
-- date :end_date = 2024-01-01

WITH group_users_filtered AS (
    SELECT 
        gu.user_id
    FROM group_users gu
    JOIN groups g ON g.id = gu.group_id
    WHERE g.name = :group_name_filter
),
user_groups AS (
    SELECT 
        gu.user_id, 
        STRING_AGG(g.name, ', ') AS group_names
    FROM group_users gu
    JOIN groups g ON g.id = gu.group_id
    GROUP BY gu.user_id
),
questions_solved AS (
    SELECT 
        p.user_id, 
        DATE_TRUNC(:date_trunc, dst.created_at) AS month,
        COUNT(*) AS total_solved
    FROM discourse_solved_solved_topics dst
    JOIN posts p ON p.id = dst.answer_post_id
    JOIN group_users_filtered guf ON guf.user_id = p.user_id
    WHERE dst.created_at BETWEEN :start_date AND :end_date
    GROUP BY p.user_id, DATE_TRUNC(:date_trunc, dst.created_at)
),
assigns_per_user AS (
    SELECT 
        a.assigned_to_id AS user_id, 
        DATE_TRUNC(:date_trunc, a.created_at) AS month,
        COUNT(a.topic_id) AS total_assigned
    FROM assignments a
    JOIN topics t ON t.id = a.topic_id
    JOIN group_users_filtered guf ON guf.user_id = a.assigned_to_id
    WHERE a.assigned_to_type = 'User'
      AND t.deleted_at IS NULL
      AND a.created_at BETWEEN :start_date AND :end_date
    GROUP BY a.assigned_to_id, DATE_TRUNC(:date_trunc, a.created_at)
)
SELECT 
    COALESCE(qs.month, apu.month)::DATE AS date,
    :date_trunc as date_range,
    COALESCE(qs.user_id, apu.user_id, ug.user_id) AS user_id, 
    COALESCE(qs.total_solved, 0) AS total_solved_questions,
    COALESCE(apu.total_assigned, 0) AS total_assigned_topics,
    COALESCE(ug.group_names, '') AS group_names
FROM questions_solved qs
FULL OUTER JOIN assigns_per_user apu ON qs.user_id = apu.user_id AND qs.month = apu.month
LEFT JOIN user_groups ug ON ug.user_id = COALESCE(qs.user_id, apu.user_id)
WHERE (qs.user_id IN(:user_list) OR :userlist_filter = FALSE)
ORDER BY date DESC

شرح استعلام SQL

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

شرح CTEs

  1. group_users_filtered: يحدد هذا CTE المستخدمين الذين هم أعضاء في المجموعة المحددة (:group_name_filter). يقوم بتصفية المستخدمين بناءً على عضويتهم في المجموعة ذات الأهمية.
  2. user_groups: يقوم هذا CTE بتجميع جميع المجموعات التي ينتمي إليها المستخدم في سلسلة واحدة. يساعد هذا في تحديد جميع المجموعات المرتبطة بالمستخدم، مما يوفر سياقًا لأنشطته.
  3. questions_solved: يحسب هذا CTE العدد الإجمالي للأسئلة التي حلها كل مستخدم خلال النطاق الزمني المحدد (:start_date إلى :end_date).
  4. assigns_per_user: على غرار questions_solved، يقوم هذا CTE بحساب عدد المهام المعينة لكل مستخدم في النطاق الزمني المحدد. يضمن أن يتم فقط حساب التعيينات للمستخدمين (وليس المجموعات أو الكيانات الأخرى) ويستبعد المواضيع المحذوفة.

يجمع الاستعلام النهائي بين هذه CTEs لإنتاج تقرير يتضمن التاريخ (أو النطاق الزمني) ومعرف المستخدم وإجمالي الأسئلة التي تم حلها وإجمالي المواضيع المعينة وأسماء المجموعات التي ينتمي إليها المستخدم. يسمح بالتصفية حسب قائمة محددة من المستخدمين إذا تم توفيرها (:user_list) ويمكنه ضبط دقة التاريخ بناءً على معلمة :date_trunc (على سبيل المثال، شهر، سنة).

المعلمات

  • group_name_filter (سلسلة): اسم المجموعة لتصفية المستخدمين حسبها، تم تعيينها إلى “staff” افتراضيًا. تُستخدم هذه المعلمة لتحديد المستخدمين الذين هم أعضاء في مجموعة معينة.
  • date_trunc (سلسلة): يحدد دقة التجميع الزمني للتقارير (على سبيل المثال، “شهر”، “سنة”، “أسبوع”، “يوم”). يؤثر هذا على كيفية تجميع البيانات حسب الوقت في الإخراج.
  • user_list (قائمة مستخدمين فارغة): قائمة اختيارية بمعرفات المستخدمين لتصفية النتائج بشكل أكبر. إذا تم توفيرها، فسيشمل الاستعلام فقط البيانات لهؤلاء المستخدمين.
  • userlist_filter (منطقي): علامة للإشارة إلى ما إذا كان سيتم تطبيق عامل تصفية user_list. إذا تم تعيينه على false، فسيتم تجاهل معلمة user_list، وسيتم تضمين البيانات لجميع المستخدمين في المجموعة المحددة.
  • start_date (تاريخ): تاريخ البدء للفترة التي يتم الإبلاغ عن الأنشطة لها.
  • end_date (تاريخ): تاريخ الانتهاء للفترة التي يتم الإبلاغ عن الأنشطة لها.

النتائج

يقدم التقرير الأعمدة التالية:

  • date: التاريخ أو بداية النطاق الزمني الذي يتم تجميع البيانات له.
  • date_range: دقة النطاق الزمني (على سبيل المثال، شهر، سنة).
  • user_id: معرف المستخدم.
  • total_solved_questions: العدد الإجمالي للأسئلة التي حلها المستخدم.
  • total_assigned_topics: العدد الإجمالي للمهام المعينة للمستخدم.
  • group_names: سلسلة تحتوي على أسماء جميع المجموعات التي ينتمي إليها المستخدم.

:person_tipping_hand: لاحظ أنه بسبب الطريقة التي تعمل بها جدول assignments في Discourse، سيتمكن هذا التقرير فقط من تتبع المواضيع المعينة حاليًا، وسيعرض المواضيع المعينة حاليًا حسب التاريخ الذي تم تعيينها فيه (أو إعادة تعيينها).

نتائج مثال

date date_range user total_solved_questions total_assigned_topics group_names
2023-12-01 month user1 5 3 admins, customer-projects-team, trust_level_3, trust_level_4, trust_level_0, trust_level_1, staff, trust_level_2
2023-11-01 month user2 8 1 admins, moderators, trust_level_3, trust_level_4, trust_level_0, trust_level_1, staff, support, trust_level_2
2023-11-01 month user3 3 4 admins, moderators, trust_level_3, trust_level_4, trust_level_0, trust_level_1, staff, trust_level_2
3 إعجابات

لم يكن من الممكن أن يأتي هذا في وقت أفضل! كنت أحتاج فقط إلى القيام بشيء كهذا و ها هو! يظهر! :tada:

شكرا!

من المؤسف أننا لا نستطيع الحصول على إحصائيات حول الواجبات في الماضي (للمواضيع المغلقة). لا يمكن الحصول على كل شيء على ما أعتقد.

إعجاب واحد (1)