الانتقال إلى المحتوى الرئيسي
الوحدة 7 · الدرس 2 من 426/57 في الدورة~14 min
دروس الوحدة (2/4)

وظائف النافذة: التصنيف والحسابات لكل مجموعة

وظيفة النافذة هي وظيفة تعمل على "مجموعة من الصفوف" (النافذة) ولكن — على عكس GROUP BY — لا يقلل عدد الصفوف: يتم إرفاق القيمة المحسوبة على النافذة بكل صف من الصفوف النتيجة النهائية.

إنها الأداة المناسبة للتصنيفات والترقيم التدريجي والنسب المئوية على مجموع المجموعة، والعديد من العمليات الأخرى التي تكون محرجة أو مستحيل مع GROUP BY.

بناء الجملة: function() OVER (…)

SQL
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)

عناصر:

  • PARTITION BY — يحدد "المجموعات" (مثل GROUP BY، ولكن الصفوف ابق منفصلاً)؛
  • ORDER BY داخل OVER(…) — يحدد الترتيب داخل التقسيم.

OVER () (الأقواس الفارغة) تعني "الجدول بأكمله كنافذة واحدة". مفيدة لحسابات مثل "النسبة المئوية للإجمالي".

وظائف الترتيب

SQL
ROW_NUMBER() OVER (PARTITION BY p ORDER BY o)
RANK()       OVER (PARTITION BY p ORDER BY o)
DENSE_RANK() OVER (PARTITION BY p ORDER BY o)

الاختلافات (بالقيم 100, 100, 90, 80):

وظيفةالمناصب
محمي_INLINE_91، 2، 3، 4 (فريد دائمًا)
محمي_INLINE_101، 1، 3، 4 (العلاقات تتشارك في المركز، تترك "فجوات")
محمي_INLINE_111، 1، 2، 3 (الروابط تشترك في المركز، بدون ثغرات)

مثال: تصنيف المنتج حسب الفئة

SQL
SELECT name,
       category_id,
       price,
       RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS rank
FROM   products
ORDER BY category_id, rank;

لكل category_id يتم إعادة تشغيل RANK من 1 والطلب بالتنازل السعر: تحصل على تصنيف المنتجات ضمن كل فئة، في فئة واحدة بالرصاص.

الترقيم التدريجي

SQL
-- Progressive order number for each customer:
SELECT id,
       customer_id,
       ordered_at,
       ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ordered_at) AS row_num
FROM   orders
ORDER BY customer_id, row_num;

سيكون الطلب الأول لكل عميل يحتوي على row_num = 1، والثاني 2، وما إلى ذلك.

جربه

تمرين#sql.m7.l2.e1
المحاولات: 0جارٍ التحميل…

لكل منتج، قم بعرض الاسم، وcategor_id، والسعر، والرتبة (الترتيب من خلال السعر التنازلي داخل الفئة؛ استخدم RANK). قم بالترتيب حسب تصاعدي class_id والرتبة التصاعدية.

جارٍ تحميل المحرر…
إظهار التلميح

التقسيم حسب مجموعات Category_id، والترتيب حسب السعر DESC للطلبات داخل المجموعة.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m7.l2.e2
المحاولات: 0جارٍ التحميل…

بالنسبة لكل طلب، يظهر معرف العميل وcustomer_id وorder_at وrow_num (ROW_NUMBER تقدمي لكل عميل، ويتم ترتيبه بشكل تصاعدي order_at). الطلب حسب customer_id وrow_num.

جارٍ تحميل المحرر…
إظهار التلميح

يكون ROW_NUMBER دائمًا فريدًا داخل القسم.

الحل متاح بعد 3 من المحاولات