هل إضافة id إلى ترتيب DENSE_RANK تلغي تعادل الرواتب؟

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

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

الإجابة

تحدد دوال الرتب التعادل بناءً على جميع تعبيرات 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 من الأساسيات للاحتراف.

اختبر فهمك

ما قيم dr حسب ترتيب id عندما يتضمن ترتيب النافذة salary وid معًا؟

CREATE TABLE employees (
  id INT PRIMARY KEY,
  salary INT NOT NULL
);
INSERT INTO employees (id, salary) VALUES
(1, 9000), (2, 9000), (3, 7000), (4, 7000);

SELECT id,
       DENSE_RANK() OVER (ORDER BY salary DESC, id ASC) AS dr
FROM employees
ORDER BY id;