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