محتويات الدورة

قاعدة بيانات أوراكل / المتوسط: SQL التطبيقات والأدلة / الدرس 8

النوافذ التحليلية والترتيب الحتمي

احتفظ بتفاصيل الشحنات أثناء حساب الرتب والمجاميع التراكمية ومقارنات الحدث السابق.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اختر التقسيم والترتيب وإطار النافذة مستقلة.
  • اشرح التعادل وصفِّ المخرجات التحليلية باستعلام خارجي.

تحفظ التحليلات صفوف التفاصيل

يختزل GROUP BY المجتمع إلى صف لكل مجموعة. أما SUM(...) OVER (...) فيضيف قيمة لكل صف تفصيلي. يحدد PARTITION BY مجتمعات مستقلة ولا يتعلق بالتقسيم المادي للجدول. يبدأ المجموع التراكمي لكل عميل مجدداً حتى لو كانت الصفوف في جدول مادي واحد. سمِّ تفصيل النتيجة قبل النافذة لأن الربط والتصفية يسبقان التحليلات. تبقى الشحنة المكررة من ربط مسوح سابق مكررة وتفسد الحساب التحليلي بدلاً من إصلاحها تلقائياً.

صرّح بالإطار عند التراكم

للمجموع صفاً بعد صف استخدم ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW مع ترتيب كلي. في المثال وقتا حجز متساويان فيفصل shipment_id التعادل. قد ينتج حذف الإطار نافذة RANGE منطقية تتلقى فيها الصفوف النظيرة القيمة التراكمية نفسها. يفيد ذلك لأسئلة لكنه يختلف عن دفتر متسلسل. يبقى ORDER BY النهائي ضرورياً؛ فالترتيب داخل OVER للحساب وليس ضمان العرض. هذان عقدان منفصلان وإن استخدما التعبيرات نفسها.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
WITH charges AS (
 SELECT 101 shipment_id, 7 customer_id, 10 charge FROM dual UNION ALL
 SELECT 102, 7, 5 FROM dual UNION ALL
 SELECT 103, 7, 8 FROM dual
)
SELECT shipment_id, charge,
 SUM(charge) OVER (PARTITION BY customer_id ORDER BY shipment_id
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_charge
FROM charges ORDER BY shipment_id;
الناتج المتوقع
SHIPMENT_ID | CHARGE | RUNNING_CHARGE
101         | 10     | 10
102         | 5      | 15
103         | 8      | 23

يضم التقسيم عميلاً واحداً؛ يجمع إطار الصفوف الصريح 10 ثم 15 ثم 23.

اختر معنى التعادل المطلوب

يعطي ROW_NUMBER مواضع مختلفة ويحتاج فاصل تعادل فريداً لتكرار النتيجة. يعطي RANK المتعادلين الرتبة نفسها ويترك فجوات؛ وDENSE_RANK يفعل ذلك بلا فجوات. قد تعني «أعلى ثلاث شحنات» ثلاثة سجلات بالضبط أو كل سجلات أعلى ثلاث فئات رسوم أو كل المتعادلين في المرتبة الثالثة. هذه طلبات مختلفة. لا تضف معرّفاً فريداً إلى ترتيب DENSE_RANK المقصود لتجميع الرسوم المتساوية لأنه يزيل التعادل. استخدم مفتاح عرض نهائياً مستقلاً عند الحاجة.

صفِّ بعد المرحلة التحليلية

في أساس 19c احسب ROW_NUMBER في استعلام داخلي وصفِّ اسمه المستعار خارجياً. لا يستطيع WHERE في الكتلة نفسها اختيار الاسم التحليلي لأنه يسبق الحساب منطقياً. يعيد المثال أحدث شحنة لكل عميل مع موضع NULL وفاصل معرّف صريحين. يفترض أن وقت الحجز NULL يتأخر عن المعلوم. إذا كانت القيم الغائبة غير صالحة تجارياً فارفضها أو صفِّها عمداً قبل الترتيب؛ لا تغيّر معناها لاختصار الصياغة.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
SELECT customer_id, shipment_id, booked_at
FROM (
 SELECT customer_id, shipment_id, booked_at,
 ROW_NUMBER() OVER (PARTITION BY customer_id
 ORDER BY booked_at DESC NULLS LAST, shipment_id DESC) AS rn
 FROM shipments
)
WHERE rn = 1
ORDER BY customer_id;

يبقى صف واحد على الأكثر لكل عميل، ويكون المفتاح الفائز حتمياً لمجموعة مدخلات ثابتة.

السابق هو السابق وفق ترتيب معلن

تقارن LAG وLEAD صفوفاً متجاورة مرتبة دون ربط ذاتي لكل حدث. لا يعني وقت المسح السابق شيئاً قبل تحديد تقسيم الشحنة وترتيب الوقت وقاعدة تساوي المسوح. قد يسجل تسلسل الاستلام ترتيب الوصول لا ترتيب الحدث الفيزيائي المبلغ من الجهاز. سمِّ التاريخ الذي يعيد التقرير بناءه. صرّح بسلوك NULL وميّز غياب الصف السابق من وجود صف سابق بقيمة غائبة حيث يلزم. وقد تستهلك عمليات الفرز والتقسيم الكبيرة الذاكرة والمساحة المؤقتة، فاجمع مراجعة المعنى وأدلة الخطة قبل التوسع.

الأخطاء الشائعة وإصلاحها

ORA-30483

لماذا يحدث؟
وُضع تعبير تحليلي في موضع لا يسمح به.
كيف تصلحه؟
احسبه في SELECT داخلي وصفِّ العمود الناتج خارجياً.
كيف تتجنب تكراره؟
راجع التسلسل المنطقي للتصفية والتجميع والتحليل.

تقفز المجاميع التراكمية عند أوقات متساوية

لماذا يحدث؟
يجمع الإطار المنطقي الافتراضي الصفوف النظيرة.
كيف تصلحه؟
اختر إطار ROWS صريحاً وترتيباً حتمياً للتراكم المتسلسل.
كيف تتجنب تكراره؟
اختبر قيم ترتيب متكررة لا أوقاتاً فريدة فقط.

تتغير أحدث شحنة بين عمليات التنفيذ

لماذا يحدث؟
يترك ترتيب ROW_NUMBER تعادلاً دون حسم.
كيف تصلحه؟
أضف فاصل تعادل فريداً ثابتاً مع حفظ الفرز الأساسي.
كيف تتجنب تكراره؟
حدّد دلالات التعادل في شروط قبول التقرير.

اختبر فهمك

1. للرسوم 20 و20 و10 تنازلياً، ما RANK وDENSE_RANK؟

اعرض الحل المشروح

يعطي RANK القيم 1 و1 و3، ويعطي DENSE_RANK القيم 1 و1 و2 عند الترتيب بالرسم وحده. يعطي ROW_NUMBER مواضع مختلفة لكن العشرينين يحتاجان مفتاحاً إضافياً فريداً لتعيين ثابت. اختر الدالة وفق معالجة التعادل التجارية.

2. لماذا لا يكفي ORDER BY داخل OVER لضمان ترتيب العرض؟

اعرض الحل المشروح

إنه يحدد الحساب التحليلي داخل الأقسام. لا تزال النتيجة الخارجية تحتاج ORDER BY خاصاً لعقد العرض. قد تعيد خطة أخرى الصفوف بترتيب مختلف دون تغيير القيم التحليلية. اكتب الترتيب النهائي صراحة واختبر المستهلك وفق الأعمدة الموثقة.

أهم ما تعلمته

  • التقسيم والترتيب التحليلي والإطار وترتيب العرض خيارات منفصلة.
  • التعادل متطلب أعمال يجب ترميزه عمداً.

المراجع الرسمية