أفضل N لكل مجموعة
جزء من قسم ما وراء الأساسيات في رحلة SQL على Coddy. الدرس 23 من 27.
«الموظف الأعلى أجرًا لكل department» هو المثال النموذجي في الكتب التعليمية. تكون الوصفة دائمًا ROW_NUMBER() مع PARTITION BY، ثم التصفية إلى الصف 1.
WITH ranked AS (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1هل تريد أفضل 3 بدلًا من الأفضل 1؟ غيّر WHERE rn = 1 إلى WHERE rn <= 3. هل تريد السماح بالتعادلات في القمة؟ استبدل ROW_NUMBER() بـ RANK().
التحدي
سهلالجداول والأعمدة المتاحة:
employees:id،name،department،salary
أعِد الموظف الأعلى راتبًا في كل department. أخرج name وdepartment وsalary، مرتبةً حسب department. إذا تعادل موظفان في أعلى راتب ضمن قسم ما، فأعِد موظفًا واحدًا فقط: الموظف ذو id الأقل.
جرّب بنفسك
WITH ranked AS (
-- ROW_NUMBER() OVER (PARTITION BY department ORDER BY ...)
)
SELECT name, department, salary FROM ranked WHERE rn = 1
ORDER BY department
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس ما وراء الأساسيات
تدرّب بنفسك: Playground لـ SQL