معيار 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التحدي
سهلالجداول والأعمدة المتاحة:
newspapers:date،num_newspapers
في هذا التحدي، لدينا بيانات newspapers الخاصة بالإنتاج. نريد معرفة متوسط newspapers التي طُبعت قبل يومين من current row وبعد يوم واحد منه. كما نريد معرفة الفرق بين الحد الأقصى والحد الأدنى لعدد newspapers المطبوعة بدءًا من date الحالية وجميع الأيام الثلاثة السابقة لها. أطلق على هذين العمودين avg_newspapers وdiff_newspapers على التوالي.
جرّب بنفسك
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2الشروط
أساسيات الشروطالكلمة المفتاحية ANDالكلمة المفتاحية ORالكلمة المفتاحية NOTدمج شروط متعددةالأقواسالقيم المنطقية Booleans3تنسيق محدد للنتائج
قيم Nullترتيب النتائج - الجزء الأولترتيب النتائج - الجزء الثانيمراجعة - شركة للأمن السيبرانيتحديد عدد السجلاتمراجعة - مصنع مركبات6تحديات تمهيدية
مراجعة - الانتخابات البرلمانيةمراجعة - اعتقال الشرطة للمجرمينمراجعة - حاوية مشروبات البارمراجعة - هندسة أعمدة جديدة9جداول متعددة
الربط الأساسي - الجزء الأولالربط الأساسي - الجزء الثانيمراجعة - الربط (Join)الربط الذاتي (Self Join)مراجعة - الربط الذاتي (Self Join)الاتحاد (Union)تبسيط الاستعلامات، الكلمة المفتاحية WITHمراجعة - استعلامات WITHمراجعة - مقاول العقارات12Window Functions الجزء الثاني
دوال RANK و DENSE_RANKمراجعة - RANK و DENSE_RANKدالة NTILEدوال التجميعمعيار ROWS و RANGEتدرّب بنفسك: Playground لـ SQL