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