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

إجماليات التأخر والرصاص والتشغيل

LAG و LEAD هما وظيفتان خاصتان للنافذة تتيحان لك الوصول إلى صفوف أخرى من نفس القسم: الصف السابق (LAG) أو التالي (LEAD) وفقًا للنافذة ORDER BY. هم أداة الانتقال إلى مقارنات صف بصف (الدلتا، والتباينات، والفواصل الزمنية) و- مدمج مع SUM/AVG/COUNT OVER - لـ الإجماليات الجارية.

تأخر: الصف السابق

SQL
LAG(colonna)            OVER (PARTITION BY p ORDER BY o)
LAG(colonna, n)         OVER (PARTITION BY p ORDER BY o)   -- n righe indietro
LAG(colonna, n, default) OVER (PARTITION BY p ORDER BY o)  -- default se non c'è

مثال: لكل طلب "أيام منذ الطلب السابق بنفس الطريقة العميل":

SQL
SELECT id,
       customer_id,
       ordered_at,
       ordered_at - LAG(ordered_at) OVER (
         PARTITION BY customer_id ORDER BY ordered_at
       ) AS since_previous_order
FROM   orders
ORDER BY customer_id, ordered_at;

يحتوي الطلب الأول لكل عميل على since_previous_order = NULL بسبب لا يوجد "السابق" في القسم.

الرصاص: الصف التالي

مرآة LAG. نموذجي: "الوقت حتى الحدث التالي"، "الفرق". مع الإصدار التالي".

SQL
SELECT id, ordered_at,
       LEAD(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at)
         - ordered_at AS to_next
FROM   orders;

الإجماليات الجارية: المجاميع مع OVER

تصبح الوظائف المجمعة (SUM، AVG، COUNT، MAX، MIN) تراكمي عند دمجه مع OVER (… ORDER BY …):

SQL
SELECT order_id,
       total,
       SUM(total) OVER (
         PARTITION BY customer_id
         ORDER BY     ordered_at
       ) AS running_total
FROM   …;

لكل صف، SUM يحسب مجموع جميع الصفوف في القسم حتى تلك النقطة، وفقًا للنافذة ORDER BY. والنتيجة هي "التوازن الجاري" الكلاسيكي.

جربه

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

بالنسبة لكل طلب، قم بعرض معرف، customer_id،order_at، وعمودdays_from_previous الذي يمثل عدد الأيام الكاملة (مع FLOOR) بين الطلب الحالي والطلب السابق لنفس العميل، تم طلبه بواسطةorder_at. NULL إذا لم يكن هناك طلب سابق. الطلب حسب customer_id وorder_at.

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

LAG(ordered_at) OVER (PARTITION BY customer_id ORDER BYorder_at) يُرجع الطابع الزمني لطلب العميل السابق. اطرح لتحصل على فترة زمنية، ثم حولها إلى أيام.

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

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

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

بالنسبة لكل طلب تم تسليمه (الحالة = "تم التسليم")، أظهر المعرف، وcustomer_id، وorder_at، وorder_total (مجموع الكمية * سعر الوحدة لعناصره) وrunning_total (الإجمالي الجاري للإجماليات لكل عميل، مرتبة حسب order_at). استخدم CTE لـ order_total. الطلب حسب customer_id وorder_at.

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

يحسب CTE الإجمالي لكل طلب؛ يُنتج SUM OVER الإجمالي الجاري لكل عميل مع مرور الوقت.

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