كيف نضمن ثبات ROW_NUMBER عند تساوي الرواتب؟

متوسطقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

تعطي ROW_NUMBER() أرقامًا مختلفة حتى عندما تتساوى قيم الترتيب. إذا كتبنا ترتيبًا يعتمد على الراتب وحده، فلن يحدد الاستعلام أي موظف من أصحاب الراتب نفسه يجب أن يحصل على الرقم الأصغر. وقد تختلف هذه المفاضلة بين خطط التنفيذ أو تغيرات البيانات.

لضمان قاعدة واضحة، نضيف عمودًا فريدًا إلى ترتيب النافذة بعد العمود الأساسي. مثلًا نرتب الراتب تنازليًا ثم المعرّف تصاعديًا. عندها يتقدم صاحب المعرّف الأصغر فقط بين الموظفين الذين تساوت رواتبهم، وتبقى أولوية الراتب هي القاعدة الأساسية للترتيب.

مثال

WITH employees AS (
  SELECT 7 AS id, 8000 AS salary
  UNION ALL SELECT 3, 8000
)
SELECT id,
       ROW_NUMBER() OVER (
         ORDER BY salary DESC, id ASC
       ) AS rn
FROM employees
ORDER BY rn;

لا يكفي وضع المعرّف في ترتيب العرض الخارجي، لأن حساب الرقم يحدث اعتمادًا على ترتيب النافذة نفسه. كذلك لا يعني كون المعرّف مفتاحًا أساسيًا أن MySQL سيستخدمه تلقائيًا لحسم التعادل داخل الدالة؛ يجب التصريح به في التعبير.

باختصار: أضف مفتاحًا فريدًا إلى ORDER BY داخل النافذة عندما تحتاج إلى ترقيم ثابت بين الصفوف المتعادلة.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

في جدول employees ذي المعرّف الفريد id، أي ترتيب داخل OVER يحقق الراتب الأعلى أولًا ثم المعرّف الأصغر عند التعادل؟