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

معيار ROWS و RANGE

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

حتى الآن، لا يمكننا أن نكون مرنين بشأن اختيار عدد الصفوف التي نأخذها في الاعتبار قبل before أو بعد after. أصبح ذلك ممكنًا الآن باستخدام معايير ROWS و<code>RANGE</code>. ولاستخدامها نكتب:

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

هنا ينشئ نافذة تتضمن لكل مستوى (مرتبة بترتيب تصاعدي) المستوى current، ومستوى واحدًا قبله، ومستوى واحدًا بعده. إذا كان المستوى current هو 5، فستتضمن levels ‏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

التحدي

سهل

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

  • newspapers: date، num_newspapers

في هذا التحدي، لدينا بيانات newspapers الخاصة بالإنتاج. نريد معرفة متوسط newspapers التي طُبعت قبل يومين من current row وبعد يوم واحد منه. كما نريد معرفة الفرق بين الحد الأقصى والحد الأدنى لعدد newspapers المطبوعة بدءًا من date الحالية وجميع الأيام الثلاثة السابقة لها. أطلق على هذين العمودين avg_newspapers وdiff_newspapers على التوالي.

جرّب بنفسك

quiz iconاختبر نفسك

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

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

تدرّب بنفسك: Playground لـ SQL