هذا هو إصدار SQL من تقرير لوحة المعلومات للمساهمين الجدد.
تم تصميم تقرير لوحة معلومات SQL هذا لمنح المسؤولين نظرة عامة واضحة على تفاعل المستخدمين في منتدى Discourse الخاص بهم من خلال تحديد عدد المستخدمين الذين قاموا بأول منشور لهم في كل يوم ضمن نطاق تاريخ محدد.
-- [params]
-- date :start_date = 2023-12-15
-- date :end_date = 2024-01-16
SELECT
date_trunc('day', p.created_at)::date AS day,
COUNT(DISTINCT p.user_id) AS new_contributors
FROM
posts p
INNER JOIN (
SELECT
user_id,
MIN(created_at) as first_post_date
FROM
posts
WHERE deleted_at IS NULL
GROUP BY
user_id
) fp ON p.user_id = fp.user_id
WHERE
p.created_at = fp.first_post_date
AND p.created_at BETWEEN :start_date AND (:end_date::date + 1)
GROUP BY
day
ORDER BY
day
شرح استعلام SQL
يجلب التقرير عدد المستخدمين المميزين الذين قاموا بأول منشور لهم في كل يوم ضمن النطاق الزمني المحدد. يتم ذلك عن طريق تنفيذ الخطوات التالية:
المعلمات:
- يقبل الاستعلام معلمتين،
:start_dateو:end_date، اللتين تحددان النطاق الزمني للتقرير. تقبل كلتا معلمتي التاريخ تنسيق التاريخYYYY-MM-DD.
الاستعلام الداخلي: تحديد تاريخ أول منشور لكل مستخدم
يحتوي هذا التقرير على استعلام فرعي يحدد عمودين من جدول posts: user_id وأقدم طابع زمني لـ created_at (مُسمى مستعار first_post_date). يمثل أقدم طابع زمني لـ created_at أول منشور للمستخدم. يتضمن هذا الاستعلام الفرعي شرط WHERE الذي يأخذ في الاعتبار فقط المنشورات التي لم يتم حذفها (deleted_at IS NULL). أخيرًا، يقوم بتجميع النتائج حسب user_id لضمان أننا ننظر فقط إلى أول منشور لكل مستخدم.
الاستعلام الرئيسي: عد المستخدمين الذين قاموا بأول منشور لهم
يقوم الاستعلام الرئيسي بتنفيذ العمليات التالية:
- JOIN: يتم ربط جدول
postsالرئيسي (مُسمى مستعارp) بنتيجة الاستعلام الفرعي (مُسمى مستعارfp) علىuser_idلمطابقة كل منشور مع أول منشور للمستخدم المقابل. - التصفية حسب التاريخ: تتضمن عبارة
WHEREشرطين - فهي تقارن الطابع الزمني لـcreated_atلكل منشور معfirst_post_dateمن الاستعلام الفرعي لضمان أننا نتعامل فقط مع المنشورات الأولى، وتتحقق من أن الطابع الزمني لـcreated_atيقع ضمن النطاق الزمني المحدد، بما في ذلكend_date(+ يوم واحد لتضمين يوم النهاية بالكامل). - التجميع: ثم يتم تجميع المنشورات حسب التاريخ، مقطوعة إلى اليوم بدون مكون الوقت (
date_trunc('day', p.created_at)::date)، مما يسمح بعد المستخدمين الفريدين الذين نشروا لأول مرة في كل يوم. - العد: باستخدام
COUNT(DISTINCT p.user_id)، نحصل على عدد المستخدمين الفريدين الذين قاموا بأول منشور لهم في كل يوم على حدة. - الترتيب: يتم فرز النتائج حسب اليوم بترتيب تصاعدي (
ORDER BY day) لإعطاء نظرة عامة زمنية على تفاعل المستخدم.
الناتج النهائي
يتكون التقرير النهائي من عمودين:
day: تاريخ تفاعل المستخدم بدون مكون الوقت.new_contributors: عدد المستخدمين المميزين الذين قاموا بأول منشور لهم في المنتدى لكل يوم.
نتائج مثال
| day | new_contributors |
|---|---|
| 2023-12-15 | 16 |
| 2023-12-16 | 8 |
| 2023-12-17 | 7 |
| 2023-12-18 | 19 |
| 2023-12-19 | 15 |