يتطلب هذا السؤال الحفاظ على كل قسم موجود في بيانات الموظفين، حتى إذا كان جميع موظفيه يتقاضون الراتب نفسه. تصفية الصفوف على الرتبة الثانية مباشرة ستزيل القسم الذي لا يملك هذه الرتبة، بينما المطلوب إظهاره مع قيمة NULL بدل إخفائه.
نحسب أولًا DENSE_RANK() داخل كل قسم، ثم نستخدم تجميعًا شرطيًا في الاستعلام الخارجي. يعيد تعبير CASE الراتب عندما تكون الرتبة اثنين، ويعيد NULL في الحالات الأخرى. تجمع MAX هذه القيم للحصول على راتب واحد لكل قسم.
مثال
WITH employees AS (
SELECT 1 AS id, 'IT' AS department, 9000 AS salary
UNION ALL SELECT 2, 'IT', 7000
UNION ALL SELECT 3, 'HR', 6000
), ranked AS (
SELECT department, salary,
DENSE_RANK() OVER (
PARTITION BY department ORDER BY salary DESC
) AS dr
FROM employees
)
SELECT department,
MAX(CASE WHEN dr = 2 THEN salary END) AS second_salary
FROM ranked
GROUP BY department
ORDER BY department;
إذا تكرر ثاني أعلى راتب، تبقى جميع القيم المؤهلة متساوية ولا يغير ذلك الناتج. يفترض هذا المثال أن الرواتب غير فارغة، وأن الأقسام المطلوب عرضها موجودة في بيانات الموظفين. الأقسام الخالية تمامًا تحتاج إلى مصدر مستقل يسرد الأقسام.
باختصار: استخدم الترتيب الكثيف ثم التجميع الشرطي للحفاظ على الأقسام التي لا تملك راتبًا ثانيًا مختلفًا.
هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.