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

PostgreSQL / المتوسط: التزامن وSQL القابلة للصيانة / الدرس 9

العروض وCTE والاستعلامات النافذية

نظم التقرير بعلاقات مفهومة وأضف تحليلاً لكل صف دون فقد التفاصيل، واختر النطاق والتعادل والإطار صراحة.

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

أهداف الدرس

  • تمييز تعريف العرض الدائم عن CTE المحلية للعبارة.
  • حساب رتب ومجاميع تراكمية حتمية.

يوضح الاسم المرحلة لا كلفتها

يحفظ العرض تعريفاً وتحفظ materialized view نتيجة تحتاج تحديثاً بسياسة مستقلة. تسمي CTE علاقة داخل عبارة. توضح الأدوات المستوى والاعتماديات ولا تضمن السرعة أو تنفيذ المرحلة مرة واحدة. قد تدمج PostgreSQL تعبيرات مناسبة بالأصل، وتتوفر MATERIALIZED وNOT MATERIALIZED منذ 12 بقيود موثقة. افحص الخطة عند أهمية إعادة الاستخدام أو التصفية.

افصل مستوى الملخص عن الاختيار النهائي

تجمع CTE دفعتين للعميل 7 إلى خمسة وعشرين ثم تختار المجاميع فوق عشرين. تعمل WHERE النهائية على الملخص لا الدفعات. يمكن لـ HAVING التعبير عن الحد، ويفيد الملخص المسمى لربط يحتاج صفاً لكل عميل. تنتهي CTE بانتهاء العبارة ولا تستخدم لاحقاً دون إعادة التعريف أو كائن دائم.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
WITH totals AS (
 SELECT customer_id, SUM(amount) AS paid
 FROM (VALUES (7, 10), (7, 15)) AS p(customer_id, amount)
 GROUP BY customer_id
) SELECT customer_id, paid FROM totals WHERE paid > 20;
الناتج المتوقع
customer_id | paid
7           | 25

للإدخال مستوى الدفعة ولـ totals مستوى العميل.

تحفظ النافذة صف التفاصيل

خلاف GROUP BY تحفظ النافذة كل صف وتحسب عبر تقسيم مرتبط. تحدد PARTITION BY المجموعات وORDER BY الداخلي الحساب والخارجي العرض. ترقم ROW_NUMBER الصفوف وتحدد RANK وDENSE_RANK سياستي تعادل مختلفتين. صفِّ النتيجة خارجياً لأن WHERE في SELECT نفسها تسبق حساب النافذة.

اجعل الإطار التراكمي صريحاً

للمقادير خمسة وثمانية واثنين يجمع ROWS الصريح خمسة وثلاثة عشر وخمسة عشر. قد يشمل الإطار المرتب الافتراضي أقران التعادل، فلا تعبر الأوقات وحدها عن رصيد حدثي. أضف معرفاً فريداً للتسلسل المطلوب. تكرر SUM(amount) OVER () مجموع التقسيم بكل صف. الإطار جزء من الحساب لا تنسيق فقط.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
SELECT scan_id, amount,
 SUM(amount) OVER (ORDER BY scan_id
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running
FROM (VALUES (1, 5), (2, 8), (3, 2)) AS s(scan_id, amount)
ORDER BY scan_id;
الناتج المتوقع
scan_id | amount | running
1       | 5      | 5
2       | 8      | 13
3       | 2      | 15

ترتيبا الحساب والعرض صريحان ولا تحتاج العينة جدولاً.

راجع حدود العودية والكائنات الدائمة

تجمع CTE العودية بداية وتوسعاً متكرراً وتحتاج انتهاءً ودورات محددة. تزيل UNION صفوفاً كاملة مكررة وقد يحبط عمق أو مسار متغير الاعتماد عليها. تتوفر SEARCH وCYCLE منذ 14 لأنماط مناسبة. تحتاج العروض مراجعة الأمان؛ للعادية قواعد وصول مرتبطة بالمالك، وتتوفر security_invoker منذ 15. لا يعوض الاسم الودي الصلاحية أو حد الاجتياز.

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

relation "totals" does not exist (42P01)

لماذا يحدث؟
استُخدمت CTE بعد انتهاء عبارتها.
كيف تصلحه؟
كرر WITH أو استخدم عرضاً مداراً بوعي.
كيف تتجنب تكراره؟
وثق عمر كل علاقة مسماة.

يقفز المجموع عبر أوقات متعادلة

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

لا يبلغ الاستعلام العودي النهاية المطلوبة

لماذا يحدث؟
تستمر صفوف مختلفة بسبب دورات أو مسارات متغيرة.
كيف تصلحه؟
حدد الدورات والعمق قبل الاجتياز.
كيف تتجنب تكراره؟
اختبر الدورات وأقصى عمق لا شجرة بسيطة فقط.

اختبر فهمك

1. الرسوم 50 و50 و40. قارن ROW_NUMBER وRANK وDENSE_RANK لاختيار الأعلى.

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

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

2. تستخدم عودية UNION وتعرض node_id وعمقاً متزايداً. لماذا تستمر الدورة؟

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

تقارن UNION الصف كله، فتعد زيارة العقدة بعمق آخر صفاً مختلفاً. تتبع الهوية المزارة أو استخدم CYCLE المناسبة وسياسة واضحة. لا يثبت LIMIT أخير أن حساب العودية مقيد صحيحاً.

أهم ما تعلمته

  • توضح المراحل المسماة المستوى وتحفظ النوافذ التفاصيل.
  • الإطارات والتعادل والدورات وأمان العرض عقود صريحة.

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