تتشابه الدالتان RANK() وDENSE_RANK() في إعطاء الصفوف المتعادلة الرتبة نفسها. يظهر الفرق عند الانتقال إلى أول قيمة مختلفة بعد التعادل. تستخدم الأولى ترتيبًا يراعي عدد الصفوف السابقة، بينما تستخدم الثانية ترتيبًا يراعي عدد مجموعات القيم المختلفة السابقة.
إذا حصل ثلاثة لاعبين على أعلى نتيجة، تمنحهم الدالتان الرتبة الأولى. اللاعب صاحب النتيجة التالية يأخذ الرتبة الرابعة مع RANK()، لكنه يأخذ الرتبة الثانية مع DENSE_RANK(). لذلك يجب فهم المقصود بكلمة ترتيب في متطلبات السؤال قبل اختيار الدالة المناسبة.
مثال
WITH pokemon AS (
SELECT 1 AS id, 100 AS score
UNION ALL SELECT 2, 100
UNION ALL SELECT 3, 90
)
SELECT id,
RANK() OVER (ORDER BY score DESC) AS r,
DENSE_RANK() OVER (ORDER BY score DESC) AS dr
FROM pokemon
ORDER BY id;
إذا لم يوجد تعادل، تتطابق نتائج الدالتين عند استخدام الترتيب نفسه. أما عند البحث عن ثاني أعلى قيمة مختلفة، فغالبًا يكون DENSE_RANK() أوضح لأنه لا يتجاوز الرتبة الثانية بسبب تكرار القيمة الأعلى في عدة صفوف.
باختصار: تحافظ الدالتان على التعادل، لكن RANK() تترك فجوات بعده، بينما تبقي DENSE_RANK() الرتب متتابعة.
هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.