دروس الوحدة (4/4)
التحولات: التأخر والرصاص
التحولات: التأخر والرصاص
في البيانات التسلسلية والمستندة إلى الوقت، غالبًا ما تحتاج إلى مقارنة الصف الحالي بالصف من اليوم السابق. في لغة SQL "القياسية"، يتطلب القيام بذلك عمليات انضمام ذاتية خطيرة جدًا (وبطيئة جدًا).
تعمل الدالتان LAG() (الصف السابق) وLEAD() (الصف التالي) على حل هذه المشكلة تمامًا بأقصى قدر من السرعة والأناقة.
التطلع إلى الماضي والمستقبل
SELECT
created_at,
total_amount,
LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;في المثال، سيحمل كل صف بشكل ملائم الكمية التي ينتجها نفس الجدول، مع إزاحتها للأمام بمقدار صف واحد (للخلف في الوقت المناسب). يمكننا بسهولة طرح total_amount - LAG(...) لحساب الفرق أو النسبة المئوية للتغيرات الشهرية!
وبالمثل، فإن LEAD() سوف يسحب القيمة من الصف الموجود أسفل الصف الحالي مباشرة.
من جدول "المنتجات"، استخرج "id" و"launched_on" و"price" وأضف "prev_price"، أي "سعر" المنتج الذي يعتبر منطقيًا السعر "السابق"، بترتيب تصاعدي "launched_on".
إظهار التلميح
استخدم LAG(price) OVER(ORDER BY Launch_on ASC)
الحل متاح بعد 3 من المحاولات
كيف يمكنك حساب قفزات التصنيف لكل مستخدم فردي؟ قم بمحاكاتها: من جدول "المراجعات"، استخرج "customer_id" و"created_at" و" rating " و"next_rated" (المراجعة التالية لنفس العميل مع مرور الوقت). لذا، قم بالتقسيم حسب "customer_id"، والترتيب حسب "created_at"، واستخدم وظيفة النافذة اليمنى لإلقاء نظرة خاطفة على الأمام.
إظهار التلميح
LEAD() مع PARTITION BY وORDER BY في OVER.
الحل متاح بعد 3 من المحاولات