دوال RANK و DENSE_RANK
جزء من قسم الأساسيات في رحلة SQL على Coddy — الدرس 65 من 72.
تعد ROW_NUMBER() نوعاً واحداً من دوال الترتيب (ranking functions)، وهناك نوعان آخران: RANK() و DENSE_RANK().
تقوم الدالة RANK() بترقيم الصفوف مثل ROW_NUMBER()، ولكنها تعطي أرقاماً متطابقة للصفوف المتماثلة وتتخطى الأرقام. تشبه الدالة DENSE_RANK() الدالة RANK()، ولكنها لا تتخطى الأرقام.
على سبيل المثال:
| id | level |
| 1 | 5 |
| 2 | 6 |
| 3 | 6 |
| 4 | 7 |
| 5 | 7 |
| 6 | 5 |
SELECT id,
ROW_NUMBER() OVER (ORDER BY level) as row_num,
RANK() OVER (ORDER BY level) as row_rank,
DENSE_RANK() OVER (ORDER BY level) as row_dense_rank
FROM table1سيعيد هذا:
| id | row_num | row_rank | row_dense_rank |
| 1 | 1 | 1 | 1 |
| 6 | 2 | 1 | 1 |
| 2 | 3 | 3 | 2 |
| 3 | 4 | 3 | 2 |
| 4 | 5 | 5 | 3 |
| 5 | 6 | 5 | 3 |
الشرح:
ROW_NUMBER(): فريد دائمًا: 1، 2، 3، 4، 5، 6RANK():- المستوى 5 (صفان): يحصل كلاهما على الترتيب 1
- المستوى 6 (صفان): يحصل كلاهما على الترتيب 3 (يتخطى 2)
- المستوى 7 (صفان): يحصل كلاهما على الترتيب 5 (يتخطى 4)
DENSE_RANK():- المستوى 5 (صفان): يحصل كلاهما على الترتيب 1
- المستوى 6 (صفان): يحصل كلاهما على الترتيب 2 (بدون تخطي)
- المستوى 7 (صفان): يحصل كلاهما على الترتيب 3 (بدون تخطي)
التحدي
سهلالجداول والأعمدة المتاحة:
<strong>medals</strong>:<strong>region</strong>,<strong>medal_color</strong>,<strong>medal_count</strong>
أنشئ استعلاماً يعرض المنطقة (region)، وإجمالي عدد الميداليات (مجموع كل الميداليات بغض النظر عن اللون)، ونوعين من التصنيفات:
- تصنيف
regular_rank(مع وجود فجوات) بناءً على مجموع الميداليات - تصنيف
dense_rank(بدون فجوات) بناءً على مجموع الميداليات
رتب النتيجة حسب:
order by total_medals desc, region ascورقة مرجعية
يوفر SQL ثلاث دوال للترتيب (ranking functions) تتصرف بشكل مختلف مع القيم المتساوية:
ROW_NUMBER()- تعين أرقاماً تسلسلية فريدةRANK()- تعين نفس الرتبة للقيم المتساوية وتتخطى الرتب اللاحقةDENSE_RANK()- تعين نفس الرتبة للقيم المتساوية دون تخطي أي رتب
على سبيل المثال:
| id | level |
| 1 | 5 |
| 2 | 6 |
| 3 | 6 |
| 4 | 7 |
| 5 | 7 |
| 6 | 5 |
SELECT id,
ROW_NUMBER() OVER (ORDER BY level) as row_num,
RANK() OVER (ORDER BY level) as row_rank,
DENSE_RANK() OVER (ORDER BY level) as row_dense_rank
FROM table1سيعيد هذا ما يلي:
| id | row_num | row_rank | row_dense_rank |
| 1 | 1 | 1 | 1 |
| 6 | 2 | 1 | 1 |
| 2 | 3 | 3 | 2 |
| 3 | 4 | 3 | 2 |
| 4 | 5 | 5 | 3 |
| 5 | 6 | 5 | 3 |
جرّب بنفسك
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
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