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

دوال RANK و DENSE_RANK

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

تعد ROW_NUMBER() نوعاً واحداً من دوال الترتيب (ranking functions)، وهناك نوعان آخران: RANK() و DENSE_RANK().

تقوم الدالة RANK() بترقيم الصفوف مثل ROW_NUMBER()، ولكنها تعطي أرقاماً متطابقة للصفوف المتماثلة وتتخطى الأرقام. تشبه الدالة DENSE_RANK() الدالة RANK()، ولكنها لا تتخطى الأرقام.

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

idlevel
15
26
36
47
57
65
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

سيعيد هذا:

idrow_numrow_rankrow_dense_rank
1111
6211
2332
3432
4553
5653

الشرح:

  • ROW_NUMBER(): فريد دائمًا: 1، 2، 3، 4، 5، 6
  • RANK():
    • المستوى 5 (صفان): يحصل كلاهما على الترتيب 1
    • المستوى 6 (صفان): يحصل كلاهما على الترتيب 3 (يتخطى 2)
    • المستوى 7 (صفان): يحصل كلاهما على الترتيب 5 (يتخطى 4)
  • DENSE_RANK():
    • المستوى 5 (صفان): يحصل كلاهما على الترتيب 1
    • المستوى 6 (صفان): يحصل كلاهما على الترتيب 2 (بدون تخطي)
    • المستوى 7 (صفان): يحصل كلاهما على الترتيب 3 (بدون تخطي)
challenge icon

التحدي

سهل

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

  • <strong>medals</strong>: <strong>region</strong>, <strong>medal_color</strong>, <strong>medal_count</strong>

أنشئ استعلاماً يعرض المنطقة (region)، وإجمالي عدد الميداليات (مجموع كل الميداليات بغض النظر عن اللون)، ونوعين من التصنيفات:

  1. تصنيف regular_rank (مع وجود فجوات) بناءً على مجموع الميداليات
  2. تصنيف dense_rank (بدون فجوات) بناءً على مجموع الميداليات

رتب النتيجة حسب:

order by total_medals desc, region asc

ورقة مرجعية

يوفر SQL ثلاث دوال للترتيب (ranking functions) تتصرف بشكل مختلف مع القيم المتساوية:

  • ROW_NUMBER() - تعين أرقاماً تسلسلية فريدة
  • RANK() - تعين نفس الرتبة للقيم المتساوية وتتخطى الرتب اللاحقة
  • DENSE_RANK() - تعين نفس الرتبة للقيم المتساوية دون تخطي أي رتب

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

idlevel
15
26
36
47
57
65
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

سيعيد هذا ما يلي:

idrow_numrow_rankrow_dense_rank
1111
6211
2332
3432
4553
5653

جرّب بنفسك

quiz iconاختبر نفسك

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

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