كيف تتعامل RANK مع القيم المتساوية في SQL؟

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

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

الإجابة

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

إذا كان لدينا موظفان يتشاركان أعلى راتب، يأخذ كلاهما الرتبة الأولى. الموظف صاحب الراتب التالي يأخذ الرتبة الثالثة، لأن صفين يسبقانه في الترتيب. هذا السلوك مناسب لتمثيل ترتيب تنافسي يسمح بالتعادل ويحتفظ بأثر عدد المتنافسين السابقين.

مثال

WITH employees AS (
  SELECT 1 AS id, 9000 AS salary
  UNION ALL SELECT 2, 9000
  UNION ALL SELECT 3, 7000
)
SELECT id, salary,
       RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees
ORDER BY id;

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

باختصار: تعطي RANK() رتبة مشتركة للقيم المتساوية، وتترك فجوات في الرتب التي تأتي بعد التعادل.

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

اختبر فهمك

ما قيم salary_rank حسب ترتيب 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, 6000);

SELECT id,
       RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees
ORDER BY id;