قد يعني اختيار أول ثلاثة موظفين السماح بإضافة موظفين آخرين إذا تساوت رواتبهم مع راتب الموظف الثالث. هنا لا نريد ثلاثة مستويات مختلفة من الرواتب، بل نريد الصفوف الثلاثة الأولى وكل من يتعادل مع آخر صف منها. لهذا يجب التمييز بين حد الصفوف وحد القيم المختلفة.
تساعد RANK() على تنفيذ هذا المعنى عندما نرتب بحسب الراتب تنازليًا فقط. رتبة كل مجموعة متعادلة تساوي موقع أول صف فيها. لذلك فإن شرط الرتبة الأقل من أو المساوية لثلاثة يضم أي مجموعة يبدأ ظهورها ضمن أول ثلاثة صفوف.
مثال
WITH employees AS (
SELECT 1 AS id, 9000 AS salary
UNION ALL SELECT 2, 9000
UNION ALL SELECT 3, 8000
UNION ALL SELECT 4, 8000
UNION ALL SELECT 5, 7000
), ranked AS (
SELECT id, salary,
RANK() OVER (ORDER BY salary DESC) AS r
FROM employees
)
SELECT id, salary
FROM ranked
WHERE r <= 3
ORDER BY salary DESC, id;
في المثال يقع الحد داخل مجموعة الراتب 8000، فتدخل المجموعة كلها. أما DENSE_RANK() فقد تضيف مستوى 7000 لأنه الثالث بين القيم المختلفة، وROW_NUMBER() ستحتفظ بثلاثة صفوف فقط وتستبعد أحد المتعادلين عند الحد.
باختصار: استخدم RANK() لحد مبني على مواقع الصفوف مع تضمين التعادل عند الحد، لا لعدد مستويات الرواتب.
هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.