دروس الوحدة (3/4)
إجماليات التأخر والرصاص والتشغيل
LAG و LEAD هما وظيفتان خاصتان للنافذة تتيحان لك الوصول إلى
صفوف أخرى من نفس القسم: الصف السابق (LAG) أو
التالي (LEAD) وفقًا للنافذة ORDER BY. هم
أداة الانتقال إلى مقارنات صف بصف (الدلتا، والتباينات، والفواصل الزمنية)
و- مدمج مع SUM/AVG/COUNT OVER - لـ الإجماليات الجارية.
تأخر: الصف السابق
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'èمثال: لكل طلب "أيام منذ الطلب السابق بنفس الطريقة العميل":
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. نموذجي: "الوقت حتى الحدث التالي"، "الفرق".
مع الإصدار التالي".
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 …):
SELECT order_id,
total,
SUM(total) OVER (
PARTITION BY customer_id
ORDER BY ordered_at
) AS running_total
FROM …;لكل صف، SUM يحسب مجموع جميع الصفوف في القسم حتى
تلك النقطة، وفقًا للنافذة ORDER BY. والنتيجة هي
"التوازن الجاري" الكلاسيكي.
جربه
بالنسبة لكل طلب، قم بعرض معرف، 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 من المحاولات
تمرين المراجعة
بالنسبة لكل طلب تم تسليمه (الحالة = "تم التسليم")، أظهر المعرف، وcustomer_id، وorder_at، وorder_total (مجموع الكمية * سعر الوحدة لعناصره) وrunning_total (الإجمالي الجاري للإجماليات لكل عميل، مرتبة حسب order_at). استخدم CTE لـ order_total. الطلب حسب customer_id وorder_at.
إظهار التلميح
يحسب CTE الإجمالي لكل طلب؛ يُنتج SUM OVER الإجمالي الجاري لكل عميل مع مرور الوقت.
الحل متاح بعد 3 من المحاولات