انتقل إلى محتوى الدرس

Top N Per Category Pattern استخراج أعلى السجلات بكل فئة

تعلّم دوال النوافذ التحليلية OVER و PARTITION BY والترتيب في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
1 صفوف تعليمية
MySQL
7 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

نظراً لأن دوال النوافذ تُنفَّذ منطقياً بعد جملة WHERE، لا يسمح SQL بكتابة دالة نافذة مباشرة داخل WHERE. ولحل مسألة استخراج أعلى N سجلات في كل فئة (مثل أغلى 3 منتجات داخل كل قسم)، ندمج تعبير WITH مع دالة الترتيب:

  • الخطوة الأولى (داخل CTE): نحسب عمود الترتيب DENSE_RANK() OVER (PARTITION BY category_id ORDER BY unit_price DESC) AS price_rank.
  • الخطوة الثانية (في الاستعلام الخارجي): نصفي مخرجات التعبير الجدولي بكتابة WHERE price_rank <= 3.
SQL
-- Fetch top 2 products per category via CTE + DENSE_RANK
WITH ranked_products AS (
  SELECT product_id, category_id, product_title, unit_price,
         DENSE_RANK() OVER (
           PARTITION BY category_id ORDER BY unit_price DESC
         ) AS price_rank
  FROM products
)
SELECT category_id, product_title, unit_price, price_rank
FROM ranked_products WHERE price_rank <= 2;