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

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

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

الإجابة

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

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

مثال

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

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

باختصار: قسم الصفوف بحسب المجموعة، ورقّمها وفق الأولوية، ثم اختر الأرقام المطلوبة في مستوى خارجي.

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

اختبر فهمك

بعد حساب rn بالكود التالي، أي شرط يعيد ثلاثة موظفين على الأكثر من كل قسم؟

WITH employees AS (
  SELECT 1 AS id, 'IT' AS department, 9000 AS salary
  UNION ALL SELECT 2, 'IT', 8000
  UNION ALL SELECT 3, 'HR', 7000
), ranked AS (
  SELECT id, department,
         ROW_NUMBER() OVER (
           PARTITION BY department
           ORDER BY salary DESC, id
         ) AS rn
  FROM employees
)
SELECT id, department
FROM ranked
/* Add the WHERE clause here. */
ORDER BY department, rn;