كيف أجلب أعلى 3 رواتب في كل قسم بـ SQL؟

سهلقراءة دقيقةآخر تحديث 1 أكتوبر 2026

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

الإجابة

نستخدم دالة النافذة 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;

كيف يعمل؟

  1. PARTITION BY DepartmentID: يقسم الموظفين حسب القسم.
  2. ORDER BY Salary DESC: يرتبهم داخل كل قسم من الأعلى راتبًا.
  3. ROW_NUMBER(): يعطي كل موظف رقمًا 1، 2، 3… داخل قسمه.
  4. الاستعلام الخارجي يأخذ من رقمه 3 أو أقل.

لماذا لا ينجح GROUP BY مع LIMIT؟

LIMIT 3 يأخذ 3 صفوف من النتيجة كلها، وليس 3 من كل قسم. وGROUP BY يدمج كل قسم في صف واحد.

دوال النافذة مدعومة في MySQL 8 وPostgreSQL وغيرهما.

اختبر فهمك

جدول Employees فيه الأعمدة: EmployeeID وFirstName وLastName وSalary وDepartmentID. أي استعلام يعيد أعلى ثلاثة رواتب في كل قسم؟