يتطلب هذا التقرير تمكين إضافة 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
- group_users_filtered: يحدد هذا CTE المستخدمين الذين هم أعضاء في المجموعة المحددة (
:group_name_filter). يقوم بتصفية المستخدمين بناءً على عضويتهم في المجموعة ذات الأهمية. - user_groups: يقوم هذا CTE بتجميع جميع المجموعات التي ينتمي إليها المستخدم في سلسلة واحدة. يساعد هذا في تحديد جميع المجموعات المرتبطة بالمستخدم، مما يوفر سياقًا لأنشطته.
- questions_solved: يحسب هذا CTE العدد الإجمالي للأسئلة التي حلها كل مستخدم خلال النطاق الزمني المحدد (
:start_dateإلى:end_date). - 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: سلسلة تحتوي على أسماء جميع المجموعات التي ينتمي إليها المستخدم.
لاحظ أنه بسبب الطريقة التي تعمل بها جدول
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 |
| … | … | … | … | … | … |