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