متوسط أوقات استجابة الموظفين للمواضيع

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

يمكن أن يساعد هذا التقرير في فهم كفاءة واستجابة تفاعلات الموظفين على موقع Discourse، وهو أمر بالغ الأهمية لإدارة المجتمع.

-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2024-01-30
-- int_list :categories = 0
-- boolean :include_subcategories = false

WITH filtered_topics AS (
    SELECT t.id AS topic_id, t.category_id, t.created_at::DATE AS created_at
    FROM topics t
    WHERE
      (
        ':categories' = '0'
        OR t.category_id IN
          (
            SELECT id
            FROM categories
            WHERE id IN(:categories)
              OR (:include_subcategories AND parent_category_id IN(:categories))
          )
      )
      AND t.created_at >= :start_date
      AND t.created_at < :end_date
      AND t.archetype = 'regular'
      AND t.deleted_at IS NULL
),
staff_replies AS (
    SELECT p.topic_id, MIN(p.created_at) AS first_staff_reply
    FROM posts p
    JOIN users u ON p.user_id = u.id
    WHERE (u.admin = true OR u.moderator = true)
      AND p.deleted_at IS NULL
      AND p.post_type = 1
    GROUP BY p.topic_id
),
response_times AS (
    SELECT
        ft.topic_id,
        ft.created_at AS topic_created_at,
        sr.first_staff_reply,
        ft.category_id as category_id,
        EXTRACT(EPOCH FROM (sr.first_staff_reply - ft.created_at)) / 3600 AS response_time_hours
    FROM filtered_topics ft
    LEFT JOIN staff_replies sr ON ft.topic_id = sr.topic_id
)
SELECT
    topic_id,
    category_id,
    topic_created_at,
    response_time_hours as staff_response_time_hours
FROM response_times
ORDER BY topic_created_at ASC

شرح استعلام SQL

يستخدم التقرير العديد من تعبيرات الجدول المشتركة (CTEs) لتقسيم الاستعلام:

  • filtered_topics: يقوم هذا CTE بتصفية المواضيع بناءً على معلمات الإدخال مثل النطاق الزمني والفئة وما إذا كان سيتم تضمين الفئات الفرعية. يضمن أن المواضيع ذات النمط العادي وغير المحذوفة فقط هي التي يتم النظر فيها.
  • staff_replies: يحدد هذا CTE أول رد تم تقديمه بواسطة عضو هيئة موظفين (إما مشرف أو معدل) للمواضيع المحددة في CTE filtered_topics. يقوم بتصفية المشاركات المحذوفة ويعتبر فقط المشاركات الرئيسية (post_type = 1).
  • response_times: يحسب هذا CTE وقت الاستجابة عن طريق إيجاد الفرق بين وقت إنشاء الموضوع وأول وقت رد من قبل الموظفين. يتم تحويل النتيجة من ثوانٍ إلى ساعات.

الجملة SELECT النهائية من CTE response_times تجلب معرف الموضوع، ومعرف الفئة، وتاريخ إنشاء الموضوع، ووقت استجابة الموظفين المحسوب بالساعات، وترتيب النتائج حسب تاريخ إنشاء الموضوع.

المعلمات

  • start_date (date): تاريخ بداية الفترة التي سيتم تحليل إنشاء المواضيع فيها.
  • end_date (date): تاريخ نهاية الفترة التي سيتم تحليل إنشاء المواضيع فيها.
  • categories (int_list): قائمة بمعرفات الفئات لتصفية المواضيع. إذا تم تعيينها على 0، يتم تضمين جميع الفئات.
  • include_subcategories (boolean): علامة لتحديد ما إذا كان سيتم تضمين الفئات الفرعية للفئات المحددة في التحليل.

النتائج

  • topic_id: المعرف الفريد للموضوع.
  • category_id: الفئة التي ينتمي إليها الموضوع.
  • topic_created_at: تاريخ إنشاء الموضوع.
  • staff_response_time_hours: الوقت الذي استغرقه الموظفون للرد على الموضوع بالساعات. تشير القيمة NULL إلى عدم وجود رد من الموظفين على الموضوع.

نتائج مثال

topic_id category_id topic_created_at staff_response_time_hours
101 5 2024-01-02 1.5
102 5 2024-01-02 3.2
103 12 2024-01-03 NULL
104 12 2024-01-04 0.75
إعجاب واحد (1)

هل هناك طريقة سهلة لاستبعاد المواضيع التي بدأها الموظفون؟

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

نعم، يمكنك تعديل التقرير على النحو التالي لاستبعاد المواضيع التي أنشأها المستخدمون الموظفون.

-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2024-01-30
-- int_list :categories = 0
-- boolean :include_subcategories = false

WITH staff_users AS (
    SELECT id
    FROM users
    WHERE admin = true OR moderator = true
),
filtered_topics AS (
    SELECT t.id AS topic_id, t.category_id, t.created_at::DATE AS created_at
    FROM topics t
    LEFT JOIN staff_users su ON t.user_id = su.id
    WHERE
      (
        ':categories' = '0'
        OR t.category_id IN
          (
            SELECT id
            FROM categories
            WHERE id IN(:categories)
              OR (:include_subcategories AND parent_category_id IN(:categories))
          )
      )
      AND t.created_at >= :start_date
      AND t.created_at < :end_date
      AND t.archetype = 'regular'
      AND t.deleted_at IS NULL
      AND su.id IS NULL  -- Exclude topics created by staff
),
staff_replies AS (
    SELECT p.topic_id, MIN(p.created_at) AS first_staff_reply
    FROM posts p
    JOIN staff_users su ON p.user_id = su.id
    WHERE p.deleted_at IS NULL
      AND p.post_type = 1
    GROUP BY p.topic_id
),
response_times AS (
    SELECT
        ft.topic_id,
        ft.created_at AS topic_created_at,
        sr.first_staff_reply,
        ft.category_id as category_id,
        EXTRACT(EPOCH FROM (sr.first_staff_reply - ft.created_at)) / 3600 AS response_time_hours
    FROM filtered_topics ft
    LEFT JOIN staff_replies sr ON ft.topic_id = sr.topic_id
)
SELECT
    topic_id,
    category_id,
    topic_created_at,
    response_time_hours as staff_response_time
FROM response_times
ORDER BY topic_created_at ASC

التعديلات مشروحة:

  1. CTE staff_users: تمت إضافة CTE جديد لتحديد المستخدمين الذين هم إداريون أو مشرفون. يساعد هذا في تصفية المواضيع التي أنشأها الموظفون في الخطوات اللاحقة.
  2. CTE filtered_topics: يتضمن CTE هذا الآن ربطًا أيسر (LEFT JOIN) مع CTE staff_users لاستبعاد المواضيع التي يتطابق فيها user_id مع معرف أي عضو من الموظفين. يتم ذلك عن طريق التحقق من su.id IS NULL، مما يضمن أن الموضوع لم يتم إنشاؤه بواسطة موظف.
إعجاب واحد (1)

شكرًا! النتيجة أقل اضطرابًا بكثير الآن.

تبًا، كل شيء سهل.. عندما يمتلك المرء المهارات الكافية.

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