الوقت حتى أول رد من المجموعة للمواضيع المنشورة خلال فترة زمنية محددة
يعيد هذا الاستعلام الوقت المستغرق حتى أول رد من عضو في مجموعة معينة على مواضيع “عادية” (وليست رسائل شخصية) تم إنشاؤها بواسطة مستخدم ليس عضوًا في هذه المجموعة. يتم تعيين معلمة :group_name في الاستعلام افتراضيًا إلى “staff” (طاقم العمل). مع هذه القيمة، سيعطي الوقت حتى أول رد من أعضاء الطاقم. يمكنك تغيير قيمة هذه المعلمة للحصول على أوقات الاستجابة لمجموعات مختلفة، مثل “customer_support” (دعم العملاء).
يُشار إلى أنه من الناحية الفنية، يجب توفير التواريخ بصيغة yyyy-mm-dd، لكن الاستعلام يقبل أيضًا التواريخ بصيغة dd-mm-yyyy.
-- [params]
-- date :start_date
-- date :end_date
-- string :group_name = staff
WITH group_response_times AS (
SELECT
t.category_id,
t.id AS topic_id,
EXTRACT(EPOCH FROM (p.created_at - t.created_at)) / 60 AS response_time_minutes,
p.user_id AS staff_user_id,
ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY p.created_at) AS row_num
FROM posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.user_id NOT IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND p.user_id IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
AND p.post_type = 1
AND p.deleted_at IS NULL
AND t.created_at BETWEEN :start_date AND :end_date
)
SELECT
category_id,
topic_id,
staff_user_id,
ROUND(response_time_minutes::numeric, 2) AS response_time_minutes
FROM group_response_times
WHERE row_num = 1
ORDER BY category_id, response_time_minutes
متوسط الوقت حتى أول رد من المجموعة لكل فئة:
يستخدم نفس منطق الاستعلام السابق، لكنه يعيد متوسط الوقت حتى أول رد من أعضاء المجموعة المحددة لكل فئة، للمواضيع التي أنشأها مستخدمون ليسوا أعضاء في هذه المجموعة خلال الفترة الزمنية المحددة بمعلمتي :start_date و :end_date. كما هو الحال مع الاستعلام السابق، إذا تُركت معلمة :group_name على قيمتها الافتراضية “staff”، فستُرجع متوسط أوقات أول رد من الطاقم للمواضيع العادية التي أنشأها مستخدمون ليسوا من الطاقم.
-- [params]
-- date :start_date
-- date :end_date
-- string :group_name = staff
WITH group_response_times AS (
SELECT
t.category_id,
t.id AS topic_id,
EXTRACT(EPOCH FROM (p.created_at - t.created_at)) / 60 AS response_time_minutes,
p.user_id AS staff_user_id,
ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY p.created_at) AS row_num
FROM posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.user_id NOT IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND p.user_id IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
AND p.post_type = 1
AND p.deleted_at IS NULL
AND t.created_at BETWEEN :start_date AND :end_date
)
SELECT
category_id,
ROUND(AVG (response_time_minutes)::numeric, 2) AS average_response_time_minutes,
COUNT(*) AS num_topics_with_staff_responses
FROM group_response_times
WHERE row_num = 1
GROUP BY category_id

