Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

أفضل 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().

challenge icon

التحدي

سهل

الجداول والأعمدة المتاحة:

  • <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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس ما وراء الأساسيات