كيف نختار أعلى مستويين مختلفين للراتب في كل قسم؟

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

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

الإجابة

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

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

مثال

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

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

باختصار: استخدم DENSE_RANK() عندما يكون الحد المطلوب عدد القيم المختلفة، لا عدد الموظفين.

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

اختبر فهمك

أي تعبير يضع مكان 0 رتبة مناسبة لاختيار جميع أصحاب أعلى راتبين مختلفين في كل قسم عند تطبيق dr <= 2؟

WITH employees AS (
  SELECT 1 AS id, 'IT' AS department, 9000 AS salary
  UNION ALL SELECT 2, 'IT', 9000
  UNION ALL SELECT 3, 'IT', 7000
), ranked AS (
  SELECT id, department, salary,
         0 AS dr
  FROM employees
)
SELECT id, department, salary
FROM ranked
WHERE dr <= 2;