Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

معيار ROWS و RANGE

جزء من قسم الأساسيات في رحلة SQL على Coddy — الدرس 69 من 72.

حتى الآن، لا يمكننا التحلي بالمرونة فيما يتعلق باختيار عدد الصفوف التي يجب أخذها في الاعتبار قبل أو بعد. الآن أصبح ذلك ممكناً باستخدام معايير ROWS و RANGE. لاستخدامها نكتب:

OVER (ROWS BETWEEN --START-- AND --END--)

OVER (RANGE BETWEEN --START-- AND --END--)

ويمكننا تحديد الخيارات التالية:

  • CURRENT ROW - الصف الحالي
  • n PRECEDING - الصفوف التي تسبق الصف الحالي
  • n FOLLOWING - الصفوف التي تلي الصف الحالي 

الفرق بين ROWS و RANGE هو أن معيار ROWS لا يهتم بالقيم، بل بالمواقع فقط، بينما RANGE يحدد النافذة من حيث نطاقات القيم بدلاً من مواقع الصفوف.

بالنسبة لـ RANGE يجب علينا تحديد ORDER BY --column_name-- لأنه بخلاف ذلك لن يعرف كيفية اختيار النافذة.

على سبيل المثال:

ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING

هنا يتم إنشاء نافذة تتضمن الصف الحالي، والصف الذي قبله، والصف الذي بعده.

RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levels

هنا يتم إنشاء نافذة تتضمن لكل مستوى (مرتبة ترتيباً تصاعدياً) المستوى الحالي، ومستوى واحد قبله، ومستوى واحد بعده. إذا كان المستوى الحالي هو 5، فستتضمن المستويات 4 و5 و6.

ملاحظة: قد يؤدي استخدام RANGE BETWEEN إلى تضمين المزيد من الصفوف في نافذتك، لأنه يتضمن جميع الصفوف التي تشترك في نفس القيم مثل تلك الموجودة في النطاق، بينما سيقوم ROWS BETWEEN دائمًا بتضمين نفس عدد الصفوف (طالما أنها متوفرة في مجموعة البيانات). 

كما أن RANGE لا يدعم أعمدة التاريخ.

إليك مثال بسيط لتوضيح الفرق بين ROWS و RANGE:

باستخدام ROWS:

SELECT employee_name, salary,
    AVG(salary) OVER (
        ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
    ) as avg_salary_rows

باستخدام RANGE:

SELECT employee_name, salary,
    AVG(salary) OVER (
        ORDER BY salary
        RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
    ) as avg_salary_range
challenge icon

التحدي

سهل

الجداول والأعمدة المتاحة:

  • <strong>newspapers</strong>: <strong>date</strong>, <strong>num_newspapers</strong>

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

ورقة مرجعية

استخدم ROWS و RANGE لتعريف إطارات النوافذ المرنة في دوال النوافذ (window functions):

ROWS - يحدد النافذة حسب مواقع الصفوف:

OVER (ROWS BETWEEN --START-- AND --END--)

RANGE - يحدد النافذة حسب نطاقات القيم (يتطلب ORDER BY):

OVER (ORDER BY column_name RANGE BETWEEN --START-- AND --END--)

خيارات حدود النافذة:

  • CURRENT ROW - الصف الحالي
  • n PRECEDING - عدد n من الصفوف/القيم قبل الحالي
  • n FOLLOWING - عدد n من الصفوف/القيم بعد الحالي

أمثلة:

-- ROWS: يتضمن الصف الحالي + 1 قبله + 1 بعده (حسب الموقع)
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING

-- RANGE: يتضمن القيم ضمن النطاق (حسب القيمة)
ORDER BY levels
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING

الاختلافات الرئيسية:

  • ROWS - يعتمد على مواقع الصفوف، ويكون دائماً نفس عدد الصفوف
  • RANGE - يعتمد على القيم، وقد يتضمن صفوفاً أكثر بنفس القيم
  • RANGE لا يدعم أعمدة التاريخ

جرّب بنفسك

quiz iconاختبر نفسك

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

جميع دروس الأساسيات