متوسط عدد ردود الأعضاء لكل موضوع (باستثناء الموظفين)

أولاً، سنة جديدة سعيدة!! :tada:
أود معرفة استعلام SQL الذي يجب استخدامه للحصول على متوسط عدد الردود لكل موضوع قام بها المستخدمون (باستثناء المسؤولين) شهريًا.

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

شكرا لك!

سنة جديدة سعيدة :tada: (متأخرة قليلاً :slight_smile:)

بالنسبة للمتوسط، هل تبحث عن مواضيع تم إنشاؤها بواسطة كل من الموظفين وغير الموظفين، ولكن عدد الردود فقط من منشورات غير الموظفين؟ وهل ترغب في استبعاد المسؤولين فقط، أم المسؤولين والمشرفين؟

مرحباً يا جيمي!
بالضبط، يمكن للاستعلام البحث في جميع المواضيع (التي أنشأها الموظفون وغير الموظفين)، ولكن عدد الردود فقط من منشورات غير الموظفين.
حتى الآن، يمكننا استبعاد المسؤولين فقط (حيث أنني عندما أطلق مجتمعي، يكون المسؤولون والمشرفون متماثلين :))
ولكن سيكون من الجيد أيضاً الحصول بسهولة على نسبة المواضيع من الموظفين مقابل المواضيع من غير الموظفين (باستثناء المسؤولين).

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

أعتقد أن شيئًا كهذا سيعطيك الأرقام التي تبحث عنها:

-- [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 "الشهر"

مما سيعطيك شيئًا كهذا:

وقليل من الشرح الإضافي: :slight_smile:

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

بالنسبة لهذا، فإن معيار “الموظفين” هو أنهم في المجموعة التلقائية @staff، والتي تشمل كلاً من المسؤولين والمشرفين - على الرغم من أنه يمكن تعديل ذلك لاستهداف المسؤولين فقط، أو حتى مجموعة مخصصة من الموظفين الذين ليسوا “موظفي موقع” تقنيًا. إذا كنت تريد بالتأكيد استبعاد المشرفين، يمكنك استبدال group_id في البداية بـ “1” بدلاً من ذلك. :+1:

هل هذا هو النوع الذي تبحث عنه؟

3 إعجابات

لسبب غريب، أعرف أن معرف الموظفين هو ثلاثة. ولكن كيف يمكن للمرء العثور على هذا المعرف؟ في البداية، كنت متأكدًا تمامًا من أنه مدمج في عناوين URL، مثل أي معرفات أخرى، ولكن لا. الاسم هو الوحيد المستخدم.

أنا أعرف القليل جدًا من SQL لدرجة أنه يمكننا القول بسهولة أنني لا أستطيع، ولكن هذا يعرض كل معرف مجموعة

select 
    id, 
    name
from 
    groups

ولكن بالتأكيد هناك طريقة أكثر شيوعًا للعثور عليه، أليس كذلك؟

شخصيًا، أرغب حقًا في بحث عن معلمة group_id تمامًا مثل معلمة user_id :crossed_fingers: :slight_smile: - Param dropdown for group_id in data explorer query

ولكن حتى تتحقق هذه الأمنية، أستخدم تنسيق JSON لصفحة المجموعات للعثور عليها، على سبيل المثال: \u003chttps://meta.discourse.org/g.json\u003e

يمكنك إجراء بحث عن مجموعة داخل الاستعلام نفسه بحيث يعمل بأسماء المجموعات، وهو ما قد يكون طريقة أكثر سهولة في الاستخدام. لذا شيء مثل:

-- [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')
إعجابَين (2)

شكراً جزيلاً! ربما فاتني شيء ما، ولكن عندما أنقر على “Execute”، أحصل على هذا الخطأ:


كيف يمكنني فعل ذلك؟

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

نعم، هذه ميزة غريبة كان يجب أن أذكرها. إذا قمت بتحديث صفحتك، فستظهر مربعات إدخال المعلمات. :+1:

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

أراهن أنك قمت بإنشاء هذه المقتطفة على الفور. لأنها لا تعمل بشكل جيد تمامًا :wink:
يعرض كل مستخدم من المجموعة المطلوبة ويدعي أن الجميع is_staff :sweat_smile:
ولكن شكراً! لقد حصلت على معلومات قيمة للمسؤولين على المستوى الأساسي، حول json وكيفية استخدام SQL (حقا، ولكن ما زلت أحب أن أرى كيف يرى تقرير الذكاء الاصطناعي ذلك…)

في هذا المثال، يعتبر الجزء is_staff جزءًا من وظيفة هذا الاستعلام المحدد. تمت إضافته تحديدًا هنا SELECT user_id, true as is_staff بدلاً من أن يأتي من قاعدة البيانات نفسها. يقوم بتعيين أي شخص من المجموعة التي تحددها كـ “موظفين” حتى يمكن تقسيمهم إلى مجموعتين من النتائج (مشاركات الموظفين مقابل مشاركات غير الموظفين). :slight_smile:

لذلك، إذا كان لديك مجموعة لـ “الموظفين”، والتي لن تكون تقنيًا موظفي الموقع كما تحددهم قاعدة البيانات، فلا يزال بإمكانك إضافتهم وسيذهبون إلى سلة “الموظفين” وليس سلة “غير الموظفين”.

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

يا إلهي، هذا بالضبط ما كنت أحتاجه، شكرًا جزيلاً لك!
للتأكد: هل “المشاركات” تجمع المواضيع + الردود، أم أنها تحسب الردود فقط؟

شكراً لك مرة أخرى!

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

بالنسبة لهذا، لا تتضمن ‘المنشورات’ المنشور الأول للموضوع، لذا فهي الردود فقط. :+1:

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

مرحباً @JammyDodger
هل تعتقد أنه من الممكن الحصول على نفس الشيء ولكن فقط للمواضيع (= إنشاء موضوع جديد) من فضلك؟
شكراً جزيلاً!

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

هل تقصد نسبة بين المواضيع التي أنشأها الموظفون مقابل غير الموظفين المضافة إلى هذا الاستعلام؟

نعم، في نفس الاستعلام سيكون ذلك رائعًا!

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

أعتقد أن إضافة هذه الأعمدة سيفي بالغرض:

-- [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 "الشهر"

شكرا جزيلا لك، هذا مثالي!

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

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.