معيار 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التحدي
سهلالجداول والأعمدة المتاحة:
<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لا يدعم أعمدة التاريخ
جرّب بنفسك
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
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