SQL Academy · درس

كتابة الاستعلامات التحليلية

قسّم المقاييس وفصّلها واطّلع على تجميعاتها

الدرس 4 من 413 خطوة

كتابة الاستعلامات التحليلية درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما المقصود بالاستعلامات التحليلية؟

تتجاوز الاستعلامات التحليلية عمليات البحث البسيطة عن الصفوف. فبدلاً من السؤال ما الطلب الذي أجراه العميل 42؟، تسأل ما إجمالي الإيرادات حسب المنطقة والربع؟ أو كيف يقارن هذا الشهر بالشهر الماضي؟

في مستودع بيانات مبني على مخطط Star، تقوم الاستعلامات التحليلية بعملية التقسيم (تصفية بُعد واحد)، والتجزئة (تصفية عدة أبعاد)، والتجميع التصاعدي (التجميع عند مستوى أكثر عمومية) للحقائق، بهدف إظهار رؤى الأعمال.

مراجعة سريعة لمخطط Star

يحتوي مخطط Star على جدول حقائق مركزي واحد (مثل fact_sales)، تحيط به جداول الأبعاد (مثل dim_date وdim_product وdim_store). وتربط الاستعلامات التحليلية جدول الحقائق بالأبعاد المطلوبة للتحليل الحالي.

SELECT
    s.store_name,
    d.year,
    d.quarter,
    SUM(f.revenue)   AS total_revenue,
    SUM(f.units_sold) AS total_units
FROM fact_sales f
JOIN dim_store  s ON s.store_id  = f.store_id
JOIN dim_date   d ON d.date_id   = f.date_id
GROUP BY
    s.store_name,
    d.year,
    d.quarter
ORDER BY
    d.year,
    d.quarter,
    s.store_name;

التقسيم: تصفية بُعد واحد

يعني التقسيم تقييد مجموعة النتائج بقيمة واحدة من بُعد واحد، مثل عرض بيانات السنة 2024 فقط. وتُعد عبارة WHERE أداة التقسيم لديك.

يؤدي التقسيم مبكراً إلى تقليل عدد الصفوف التي يجب على قاعدة البيانات تجميعها، مما يحافظ على سرعة الاستعلامات عند التعامل مع جداول الحقائق الكبيرة.

-- Slice: only year 2024
SELECT
    p.category,
    SUM(f.revenue) AS total_revenue
FROM fact_sales f
JOIN dim_product p ON p.product_id = f.product_id
JOIN dim_date   d ON d.date_id    = f.date_id
WHERE d.year = 2024
GROUP BY p.category
ORDER BY total_revenue DESC;

التجزئة: تصفية عدة أبعاد

تعني التجزئة تطبيق عوامل تصفية على بُعدين أو أكثر في الوقت نفسه، مثل عرض مبيعات الأجهزة الإلكترونية في المنطقة الشمالية خلال الربع الأول. وكل شرط WHERE إضافي يستبعد جزءاً أصغر من مكعب البيانات.

-- Dice: category = 'Electronics', region = 'North', Q1
SELECT
    d.month,
    SUM(f.revenue)    AS revenue,
    SUM(f.units_sold) AS units
FROM fact_sales f
JOIN dim_product p ON p.product_id = f.product_id
JOIN dim_store   s ON s.store_id   = f.store_id
JOIN dim_date    d ON d.date_id    = f.date_id
WHERE
    p.category  = 'Electronics'
    AND s.region = 'North'
    AND d.year   = 2024
    AND d.quarter = 1
GROUP BY d.month
ORDER BY d.month;

التجميع التصاعدي: التجميع عند مستوى أعلى

يعني التجميع التصاعدي الانتقال من مستوى تفصيلي (المبيعات اليومية لكل متجر) إلى مستوى أكثر عمومية (المبيعات الشهرية لكل منطقة). ويتم ذلك بإزالة أعمدة GROUP BY ذات المستوى الأدنى وإعادة التجميع.

يتيح معدِّل ROLLUP إنشاء المجاميع الفرعية والإجماليات الكلية في استعلام واحد، بدلاً من كتابة عدة كتل UNION ALL.

-- Roll up from store/month to region/quarter with subtotals
SELECT
    s.region,
    d.quarter,
    SUM(f.revenue) AS revenue
FROM fact_sales f
JOIN dim_store s ON s.store_id = f.store_id
JOIN dim_date  d ON d.date_id  = f.date_id
WHERE d.year = 2024
GROUP BY ROLLUP(s.region, d.quarter)
ORDER BY s.region NULLS LAST, d.quarter NULLS LAST;

المقارنة بين الفترات باستخدام LAG

تتمثل إحدى أكثر الأنماط التحليلية شيوعاً في مقارنة مقياس بقيمة المقياس نفسه في فترة سابقة. وتتيح لك دالة النافذة LAG() جلب قيمة الصف السابق مباشرةً إلى الصف الحالي من دون استخدام ربط ذاتي.

سنحسب هنا نمو الإيرادات من شهر إلى شهر كنسبة مئوية.

WITH monthly AS (
    SELECT
        d.year,
        d.month,
        SUM(f.revenue) AS revenue
    FROM fact_sales f
    JOIN dim_date d ON d.date_id = f.date_id
    GROUP BY d.year, d.month
)
SELECT
    year,
    month,
    revenue,
    LAG(revenue) OVER (ORDER BY year, month) AS prev_month_revenue,
    ROUND(
        100.0 * (revenue - LAG(revenue) OVER (ORDER BY year, month))
             / NULLIF(LAG(revenue) OVER (ORDER BY year, month), 0),
    2) AS mom_growth_pct
FROM monthly
ORDER BY year, month;

الإجماليات التراكمية باستخدام SUM OVER

تضيف الإجماليات التراكمية (المجموع التراكمي) قيمة كل صف إلى إجمالي جميع الصفوف السابقة وفق ترتيب محدد. وهذا مناسب جداً لتتبّع الإيرادات التراكمية خلال سنة أو لمراقبة استهلاك الميزانية.

تجعل عبارة إطار النافذة ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW نطاق النافذة صريحاً وغير قابل للالتباس.

SELECT
    d.year,
    d.month,
    SUM(f.revenue)                                      AS monthly_revenue,
    SUM(SUM(f.revenue)) OVER (
        PARTITION BY d.year
        ORDER BY d.month
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    )                                                   AS ytd_revenue
FROM fact_sales f
JOIN dim_date d ON d.date_id = f.date_id
GROUP BY d.year, d.month
ORDER BY d.year, d.month;

ترتيب الأبعاد باستخدام DENSE_RANK

يتيح لك الترتيب العثور على أفضل العناصر أداءً أو أسوأها ضمن مجموعة. وتُسند DENSE_RANK() مراتب متتالية من دون فجوات عند وجود تعادلات، مما يجعلها الخيار المفضل لقوائم المتصدرين في تقارير BI.

إن تغليف النتيجة المرتبة داخل CTE ثم تصفيتها حسب المرتبة يجعل نمط top-N واضحاً وسهل القراءة.

WITH ranked_products AS (
    SELECT
        p.product_name,
        p.category,
        SUM(f.revenue) AS revenue,
        DENSE_RANK() OVER (
            PARTITION BY p.category
            ORDER BY SUM(f.revenue) DESC
        ) AS rnk
    FROM fact_sales f
    JOIN dim_product p ON p.product_id = f.product_id
    JOIN dim_date   d ON d.date_id     = f.date_id
    WHERE d.year = 2024
    GROUP BY p.product_name, p.category
)
SELECT *
FROM ranked_products
WHERE rnk <= 3
ORDER BY category, rnk;

نسبة المساهمة باستخدام SUM عبر النافذة

من المفيد معرفة الإيرادات المطلقة لمنتج ما، لكن معرفة أنه يساهم بنسبة 38٪ من إيرادات الفئة أكثر فائدة لاتخاذ الإجراءات. ويوفر SUM() عبر النافذة بأكملها المقامَ المطلوب من دون ربط استعلام فرعي.

SELECT
    p.category,
    p.product_name,
    SUM(f.revenue)                               AS product_revenue,
    SUM(SUM(f.revenue)) OVER (PARTITION BY p.category) AS category_revenue,
    ROUND(
        100.0 * SUM(f.revenue)
             / SUM(SUM(f.revenue)) OVER (PARTITION BY p.category),
    1)                                           AS pct_of_category
FROM fact_sales f
JOIN dim_product p ON p.product_id = f.product_id
JOIN dim_date   d ON d.date_id     = f.date_id
WHERE d.year = 2024
GROUP BY p.category, p.product_name
ORDER BY p.category, pct_of_category DESC;

المتوسطات المتحركة لتنعيم الاتجاهات

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

WITH monthly_rev AS (
    SELECT
        d.year,
        d.month,
        SUM(f.revenue) AS revenue
    FROM fact_sales f
    JOIN dim_date d ON d.date_id = f.date_id
    GROUP BY d.year, d.month
)
SELECT
    year,
    month,
    revenue,
    ROUND(
        AVG(revenue) OVER (
            ORDER BY year, month
            ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
        ),
    2) AS moving_avg_3m
FROM monthly_rev
ORDER BY year, month;

CUBE لجميع تركيبات الأبعاد

يوسّع CUBE إمكانات ROLLUP من خلال حساب المجاميع الفرعية لكل تركيبة ممكنة من الأبعاد المدرجة، وليس لمسار التجميع الهرمي فقط. وينتج عن ذلك ملخص كامل متعدد الأبعاد في عملية واحدة، وهو مفيد للوحات المعلومات متعددة الأبعاد التي يمكن للمستخدمين تغيير محاورها بحرية.

تعني القيمة NULL في عمود تجميع أن المقصود هو جميع قيم ذلك البُعد؛ استخدم GROUPING() للتمييز بين قيم NULL المقصودة في البيانات وقيم NULL الناتجة عن التجميع التصاعدي.

SELECT
    CASE WHEN GROUPING(s.region)   = 1 THEN 'ALL REGIONS'    ELSE s.region        END AS region,
    CASE WHEN GROUPING(p.category) = 1 THEN 'ALL CATEGORIES' ELSE p.category      END AS category,
    CASE WHEN GROUPING(d.quarter)  = 1 THEN 'ALL QUARTERS'   ELSE d.quarter::TEXT END AS quarter,
    SUM(f.revenue) AS revenue
FROM fact_sales f
JOIN dim_store   s ON s.store_id   = f.store_id
JOIN dim_product p ON p.product_id = f.product_id
JOIN dim_date    d ON d.date_id    = f.date_id
WHERE d.year = 2024
GROUP BY CUBE(s.region, p.category, d.quarter)
ORDER BY s.region NULLS LAST, p.category NULLS LAST, d.quarter NULLS LAST;

ما العملية التي تقيّد النتائج بقيمة واحدة من بُعد واحد؟

اختبر مدى فهمك للمصطلحات الخاصة بالاستعلامات التحليلية المستخدمة في مستودعات البيانات.

مراجعة: كتابة الاستعلامات التحليلية

استكشفت في هذا الدرس الأنماط الأساسية لكتابة الاستعلامات التحليلية على مخطط Star:

  • التقسيم — تصفية بُعد واحد باستخدام WHERE للتركيز على شريحة محددة.
  • التجزئة — تصفية عدة أبعاد في الوقت نفسه لاستخراج مكعب بيانات دقيق.
  • التجميع التصاعدي — التجميع عند مستوى أكثر عمومية؛ استخدم ROLLUP أو CUBE لإنشاء مجاميع فرعية متعددة المستويات.
  • LAG / LEAD — المقارنة بين الفترات من دون عمليات ربط ذاتية.
  • الإجماليات التراكمية والمتوسطات المتحركة — مقاييس تراكمية ومُنعّمة باستخدام إطارات النوافذ.
  • DENSE_RANK — ترتيب واضح لأفضل N من العناصر داخل الأقسام.
  • نسبة المساهمة % — استخدام SUM عبر النافذة بوصفه مقاماً لحساب نسب المشاركة.

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

البدء مجانًا

تعلم SQL مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
46
الدروس
183

الأسئلة الشائعة

هل درس «كتابة الاستعلامات التحليلية» مجاني؟

نعم — نص درس «كتابة الاستعلامات التحليلية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «كتابة الاستعلامات التحليلية»؟

قسّم المقاييس وفصّلها واطّلع على تجميعاتها تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «كتابة الاستعلامات التحليلية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

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

جميع الدروس في هذه الدورة

  1. ‏OLTP مقابل OLAP
  2. جداول الحقائق والأبعاد
  3. مخططات النجمة ورقاقات الثلج
  4. كتابة الاستعلامات التحليلية
← العودة إلى SQL Academy