تحدد دوال الرتب التعادل بناءً على جميع تعبيرات ORDER BY داخل النافذة، وليس العمود الأول وحده. إذا رتبنا بحسب الراتب ثم المعرّف، فلن يتعادل موظفان لهما الراتب نفسه عندما يختلف معرّفاهما. يصبح مفتاح الترتيب الكامل مختلفًا لكل صف.
هذه الإضافة مفيدة مع ROW_NUMBER() عندما نحتاج إلى اختيار ثابت بين المتعادلين، لكنها قد تغير المعنى المطلوب مع DENSE_RANK(). فإذا كنا نرتب مستويات الرواتب، يجب أن يقتصر ترتيب النافذة على الراتب، ويمكن استخدام المعرّف لاحقًا لتنظيم العرض فقط.
مثال
WITH employees AS (
SELECT 1 AS id, 9000 AS salary
UNION ALL SELECT 2, 9000
UNION ALL SELECT 3, 7000
)
SELECT id,
DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_level,
DENSE_RANK() OVER (ORDER BY salary DESC, id) AS row_level
FROM employees
ORDER BY id;
يظهر المثال أن الدالة نفسها قد تنتج رتبًا مختلفة عند تغيير مفتاح الترتيب. لذلك لا ينبغي إضافة عمود فريد إلى كل نافذة تلقائيًا. يجب أولًا تحديد ما إذا كان المطلوب المحافظة على التعادل أو كسره وفق قاعدة واضحة.
باختصار: إضافة عمود فريد داخل ترتيب دالة الرتبة تمنع تعادل الصفوف، حتى لو تساوت قيم العمود الأساسي.
هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.