نستخدم دالة النافذة ROW_NUMBER() مع PARTITION BY داخل استعلام فرعي:
SELECT Salary, DepartmentID
FROM (
SELECT Salary, DepartmentID,
ROW_NUMBER() OVER (
PARTITION BY DepartmentID
ORDER BY Salary DESC
) AS rn
FROM Employees
) AS ranked
WHERE rn <= 3;
كيف يعمل؟
PARTITION BY DepartmentID: يقسم الموظفين حسب القسم.ORDER BY Salary DESC: يرتبهم داخل كل قسم من الأعلى راتبًا.ROW_NUMBER(): يعطي كل موظف رقمًا 1، 2، 3… داخل قسمه.- الاستعلام الخارجي يأخذ من رقمه 3 أو أقل.
لماذا لا ينجح GROUP BY مع LIMIT؟
LIMIT 3 يأخذ 3 صفوف من النتيجة كلها، وليس 3 من كل قسم. وGROUP BY يدمج كل قسم في صف واحد.
دوال النافذة مدعومة في MySQL 8 وPostgreSQL وغيرهما.