بالنسبة للمتوسط، هل تبحث عن مواضيع تم إنشاؤها بواسطة كل من الموظفين وغير الموظفين، ولكن عدد الردود فقط من منشورات غير الموظفين؟ وهل ترغب في استبعاد المسؤولين فقط، أم المسؤولين والمشرفين؟
مرحباً يا جيمي!
بالضبط، يمكن للاستعلام البحث في جميع المواضيع (التي أنشأها الموظفون وغير الموظفين)، ولكن عدد الردود فقط من منشورات غير الموظفين.
حتى الآن، يمكننا استبعاد المسؤولين فقط (حيث أنني عندما أطلق مجتمعي، يكون المسؤولون والمشرفون متماثلين :))
ولكن سيكون من الجيد أيضاً الحصول بسهولة على نسبة المواضيع من الموظفين مقابل المواضيع من غير الموظفين (باستثناء المسؤولين).
أعتقد أن شيئًا كهذا سيعطيك الأرقام التي تبحث عنها:
-- [params]
-- date :start_date
-- date :end_date
WITH staff_data AS (
SELECT user_id, true as is_staff
FROM group_users
WHERE group_id = 3
),
month_stats AS (
SELECT
date_trunc('month', p.created_at)::date AS month,
COUNT(*) FILTER (WHERE p.post_number = 1) AS total_topics,
COUNT(*) FILTER (WHERE p.post_number <> 1) AS total_posts,
COUNT(DISTINCT p.user_id) FILTER (WHERE p.post_number <> 1 AND is_staff IS NOT TRUE) AS non_staff_users,
COUNT(*) FILTER (WHERE p.post_number <> 1 AND is_staff IS NOT TRUE) AS non_staff_posts,
COUNT(DISTINCT p.user_id) FILTER (WHERE p.post_number <> 1 AND is_staff) AS staff_users,
COUNT(*) FILTER (WHERE p.post_number <> 1 AND is_staff) AS staff_posts
FROM posts p
LEFT JOIN topics t ON t.id = p.topic_id
LEFT JOIN staff_data s ON p.user_id = s.user_id
WHERE p.created_at::date BETWEEN :start_date AND :end_date
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
AND p.deleted_at IS NULL
AND p.post_type = 1
AND p.user_id > 0
GROUP BY month
)
SELECT
ms.month AS "الشهر",
ms.total_topics AS "إجمالي المواضيع",
ms.total_posts AS "إجمالي المشاركات",
ms.non_staff_posts AS "مشاركات غير الموظفين",
ROUND(ms.non_staff_posts * 100.0 / NULLIF(ms.total_posts, 0),1) || '%' AS "مشاركات غير الموظفين (% من الإجمالي)",
ms.non_staff_posts / NULLIF(ms.total_topics, 0) AS "متوسط مشاركات غير الموظفين لكل موضوع",
ms.non_staff_users AS "المستخدمون غير الموظفين الذين نشروا",
ms.staff_posts AS "مشاركات الموظفين",
ROUND(ms.staff_posts * 100.0 / NULLIF(ms.total_posts, 0),1) || '%' AS "مشاركات الموظفين (% من الإجمالي)",
ms.staff_posts / NULLIF(ms.total_topics, 0) AS "متوسط مشاركات الموظفين لكل موضوع",
ms.staff_users AS "المستخدمون الموظفون الذين نشروا"
FROM month_stats ms
ORDER BY "الشهر"
تم تصميم هذا الاستعلام لتوفير ملخص إحصائي شهري لنشاط المنتدى، مع التركيز بشكل خاص على التمييز بين مساهمات المستخدمين “الموظفين” و “غير الموظفين” خلال إطار زمني معين. تشمل المقاييس المحسوبة العدد الإجمالي للمواضيع التي تم إنشاؤها، وجميع المشاركات التي تم إجراؤها، وعدد المستخدمين غير الموظفين الفريدين الذين نشروا، وعدد ونسبة المشاركات التي أجراها غير الموظفين، ومتوسط عدد مشاركات غير الموظفين لكل موضوع، بالإضافة إلى الأرقام المطابقة للموظفين. تهدف المعلومات إلى تقديم رؤى حول تفاعل المستخدمين، وإنشاء المحتوى، ومعدل مشاركة الموظفين مقابل غير الموظفين في مناقشات المنتدى. يضمن الاستعلام الدقة من خلال النظر فقط في المواضيع “العادية” (غير الخاصة) واستبعاد أي مشاركات أو مواضيع محذوفة، أو همسات/مشاركات صغيرة/إجراءات مشرف، ومشاركات من قبل مستخدمي النظام، ضمن النطاق الزمني المحدد.
بالنسبة لهذا، فإن معيار “الموظفين” هو أنهم في المجموعة التلقائية @staff، والتي تشمل كلاً من المسؤولين والمشرفين - على الرغم من أنه يمكن تعديل ذلك لاستهداف المسؤولين فقط، أو حتى مجموعة مخصصة من الموظفين الذين ليسوا “موظفي موقع” تقنيًا. إذا كنت تريد بالتأكيد استبعاد المشرفين، يمكنك استبدال group_id في البداية بـ “1” بدلاً من ذلك.
لسبب غريب، أعرف أن معرف الموظفين هو ثلاثة. ولكن كيف يمكن للمرء العثور على هذا المعرف؟ في البداية، كنت متأكدًا تمامًا من أنه مدمج في عناوين URL، مثل أي معرفات أخرى، ولكن لا. الاسم هو الوحيد المستخدم.
أنا أعرف القليل جدًا من SQL لدرجة أنه يمكننا القول بسهولة أنني لا أستطيع، ولكن هذا يعرض كل معرف مجموعة
select
id,
name
from
groups
ولكن بالتأكيد هناك طريقة أكثر شيوعًا للعثور عليه، أليس كذلك؟
يمكنك إجراء بحث عن مجموعة داخل الاستعلام نفسه بحيث يعمل بأسماء المجموعات، وهو ما قد يكون طريقة أكثر سهولة في الاستخدام. لذا شيء مثل:
-- [params]
-- string :group_name
SELECT user_id, true as is_staff
FROM group_users
WHERE group_id = (SELECT id FROM groups WHERE name = LOWER(:group_name))
(أو الإصدار الثابت إذا كنت لا ترغب في معلمة:)
SELECT user_id, true as is_staff
FROM group_users
WHERE group_id = (SELECT id FROM groups WHERE name = 'admins')
أراهن أنك قمت بإنشاء هذه المقتطفة على الفور. لأنها لا تعمل بشكل جيد تمامًا
يعرض كل مستخدم من المجموعة المطلوبة ويدعي أن الجميع is_staff
ولكن شكراً! لقد حصلت على معلومات قيمة للمسؤولين على المستوى الأساسي، حول json وكيفية استخدام SQL (حقا، ولكن ما زلت أحب أن أرى كيف يرى تقرير الذكاء الاصطناعي ذلك…)
في هذا المثال، يعتبر الجزء is_staff جزءًا من وظيفة هذا الاستعلام المحدد. تمت إضافته تحديدًا هنا SELECT user_id, true as is_staff بدلاً من أن يأتي من قاعدة البيانات نفسها. يقوم بتعيين أي شخص من المجموعة التي تحددها كـ “موظفين” حتى يمكن تقسيمهم إلى مجموعتين من النتائج (مشاركات الموظفين مقابل مشاركات غير الموظفين).
لذلك، إذا كان لديك مجموعة لـ “الموظفين”، والتي لن تكون تقنيًا موظفي الموقع كما تحددهم قاعدة البيانات، فلا يزال بإمكانك إضافتهم وسيذهبون إلى سلة “الموظفين” وليس سلة “غير الموظفين”.
-- [params]
-- date :start_date
-- date :end_date
WITH staff_data AS (
SELECT user_id, true as is_staff
FROM group_users
WHERE group_id = 3
),
month_stats AS (
SELECT
date_trunc('month', p.created_at)::date AS month,
COUNT(*) FILTER (WHERE p.post_number = 1) AS total_topics,
COUNT(*) FILTER (WHERE p.post_number = 1 AND is_staff IS NOT TRUE) AS non_staff_topics,
COUNT(*) FILTER (WHERE p.post_number = 1 AND is_staff IS TRUE) AS staff_topics,
COUNT(*) FILTER (WHERE p.post_number <> 1) AS total_posts,
COUNT(DISTINCT p.user_id) FILTER (WHERE p.post_number <> 1 AND is_staff IS NOT TRUE) AS non_staff_users,
COUNT(*) FILTER (WHERE p.post_number <> 1 AND is_staff IS NOT TRUE) AS non_staff_posts,
COUNT(DISTINCT p.user_id) FILTER (WHERE p.post_number <> 1 AND is_staff) AS staff_users,
COUNT(*) FILTER (WHERE p.post_number <> 1 AND is_staff) AS staff_posts
FROM posts p
LEFT JOIN topics t ON t.id = p.topic_id
LEFT JOIN staff_data s ON p.user_id = s.user_id
WHERE p.created_at::date BETWEEN :start_date AND :end_date
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
AND p.deleted_at IS NULL
AND p.post_type = 1
AND p.user_id > 0
GROUP BY month
)
SELECT
ms.month AS "الشهر",
ms.total_topics AS "كل المواضيع",
ms.non_staff_topics AS "مواضيع غير الموظفين",
ROUND(ms.non_staff_topics * 100.0 / NULLIF(ms.total_topics, 0),1) || '%' AS "مواضيع غير الموظفين (% من الإجمالي)",
ms.staff_topics AS "مواضيع الموظفين",
ROUND(ms.staff_topics * 100.0 / NULLIF(ms.total_topics, 0),1) || '%' AS "مواضيع الموظفين (% من الإجمالي)",
ms.total_posts AS "كل المشاركات",
ms.non_staff_posts AS "مشاركات غير الموظفين",
ROUND(ms.non_staff_posts * 100.0 / NULLIF(ms.total_posts, 0),1) || '%' AS "مشاركات غير الموظفين (% من الإجمالي)",
ms.non_staff_posts / NULLIF(ms.total_topics, 0) AS "متوسط مشاركات غير الموظفين لكل موضوع",
ms.non_staff_users AS "المستخدمون غير الموظفين الذين نشروا",
ms.staff_posts AS "مشاركات الموظفين",
ROUND(ms.staff_posts * 100.0 / NULLIF(ms.total_posts, 0),1) || '%' AS "مشاركات الموظفين (% من الإجمالي)",
ms.staff_posts / NULLIF(ms.total_topics, 0) AS "متوسط مشاركات الموظفين لكل موضوع",
ms.staff_users AS "المستخدمون الموظفون الذين نشروا"
FROM month_stats ms
ORDER BY "الشهر"