دروس الوحدة (2/4)
وظائف النافذة: التصنيف والحسابات لكل مجموعة
وظيفة النافذة هي وظيفة تعمل على "مجموعة من الصفوف"
(النافذة) ولكن — على عكس GROUP BY — لا يقلل عدد
الصفوف: يتم إرفاق القيمة المحسوبة على النافذة بكل صف من الصفوف
النتيجة النهائية.
إنها الأداة المناسبة للتصنيفات والترقيم التدريجي والنسب المئوية
على مجموع المجموعة، والعديد من العمليات الأخرى التي تكون محرجة أو
مستحيل مع GROUP BY.
بناء الجملة: function() OVER (…)
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)عناصر:
PARTITION BY— يحدد "المجموعات" (مثلGROUP BY، ولكن الصفوف ابق منفصلاً)؛ORDER BYداخلOVER(…)— يحدد الترتيب داخل التقسيم.
OVER () (الأقواس الفارغة) تعني "الجدول بأكمله كنافذة واحدة".
مفيدة لحسابات مثل "النسبة المئوية للإجمالي".
وظائف الترتيب
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_9 | 1، 2، 3، 4 (فريد دائمًا) |
| محمي_INLINE_10 | 1، 1، 3، 4 (العلاقات تتشارك في المركز، تترك "فجوات") |
| محمي_INLINE_11 | 1، 1، 2، 3 (الروابط تشترك في المركز، بدون ثغرات) |
مثال: تصنيف المنتج حسب الفئة
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 والطلب بالتنازل
السعر: تحصل على تصنيف المنتجات ضمن كل فئة، في فئة واحدة
بالرصاص.
الترقيم التدريجي
-- 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، وما إلى ذلك.
جربه
لكل منتج، قم بعرض الاسم، وcategor_id، والسعر، والرتبة (الترتيب من خلال السعر التنازلي داخل الفئة؛ استخدم RANK). قم بالترتيب حسب تصاعدي class_id والرتبة التصاعدية.
إظهار التلميح
التقسيم حسب مجموعات Category_id، والترتيب حسب السعر DESC للطلبات داخل المجموعة.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
بالنسبة لكل طلب، يظهر معرف العميل وcustomer_id وorder_at وrow_num (ROW_NUMBER تقدمي لكل عميل، ويتم ترتيبه بشكل تصاعدي order_at). الطلب حسب customer_id وrow_num.
إظهار التلميح
يكون ROW_NUMBER دائمًا فريدًا داخل القسم.
الحل متاح بعد 3 من المحاولات