كيف نستخرج ثاني أعلى راتب مختلف باستخدام DENSE_RANK؟

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

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

الإجابة

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

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

مثال

WITH employees AS (
  SELECT 1 AS id, 9000 AS salary
  UNION ALL SELECT 2, 9000
  UNION ALL SELECT 3, 7000
), ranked AS (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS dr
  FROM employees
)
SELECT DISTINCT salary
FROM ranked
WHERE dr = 2;

تجعل DISTINCT الناتج قيمة واحدة إذا كان عدة موظفين يتقاضون ثاني أعلى راتب. وإذا أردنا أسماء هؤلاء الموظفين، نحتفظ بصفوفهم بدل إزالة تكرار الراتب. وعند عدم وجود مستوى ثانٍ، لا يعيد هذا الشكل أي صف.

باختصار: استخدم DENSE_RANK() على الراتب وحده، ثم اختر الرتبة الثانية للوصول إلى ثاني قيمة مختلفة.

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

اختبر فهمك

ما قيمة salary التي يعيدها الاستعلام التالي؟

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), (5, 5000);

WITH ranked AS (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS dr
  FROM employees
)
SELECT DISTINCT salary
FROM ranked
WHERE dr = 2;