ماڈیول اسباق (3/4)
وقفہ، لیڈ اور رننگ ٹول
LAG اور LEAD دو خاص ونڈو فنکشنز ہیں جو آپ کو رسائی فراہم کرتے ہیں
اسی پارٹیشن کی دیگر قطاریں: پچھلی قطار (LAG) یا
اگلا ایک (LEAD) ونڈو کے ORDER BY کے مطابق۔ وہ ہیں
قطار سے قطار کے موازنہ کے لیے ٹول پر جائیں (ڈیلٹا، تغیرات، وقفے)
اور — SUM/AVG/COUNT OVER کے ساتھ مل کر — چلنے والے ٹوٹل کے لیے۔
LAG: پچھلی قطار
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 کے مطابق۔ نتیجہ یہ ہے۔
کلاسک "رننگ بیلنس"۔
اسے آزمائیں
ہر آرڈر کے لیے id، customer_id، ordered_at اور ایک days_from_previous کالم دکھائیں جو موجودہ آرڈر اور ایک ہی گاہک کے پچھلے ایک کے درمیان پورے دنوں کی تعداد ہے، جس کا آرڈر_at کے ذریعے آرڈر کیا گیا ہے۔ NULL اگر کوئی سابقہ آرڈر نہیں ہے۔ customer_id اور ordered_at کے ذریعے آرڈر کریں۔
اشارہ دکھائیں۔
LAG(ordered_at) OVER (PARTITION by customer_id ORDER BY ordered_at) گاہک کے پچھلے آرڈر کا ٹائم اسٹیمپ لوٹاتا ہے۔ INTERVAL حاصل کرنے کے لیے گھٹائیں، پھر دنوں میں تبدیل کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
ہر ڈیلیور کردہ آرڈر کے لیے (status = 'delivered')، دکھائیں id، customer_id، ordered_at، order_total (مقدار کا مجموعہ * اس کے لائن آئٹمز کی یونٹ_قیمت) اور run_total (فی گاہک کے ٹوٹل کا چل رہا ہے، ordered_at کے ذریعے آرڈر کیا گیا ہے)۔ آرڈر_کل کے لیے CTE استعمال کریں۔ customer_id اور ordered_at کے ذریعے آرڈر کریں۔
اشارہ دکھائیں۔
CTE کل فی آرڈر کی گنتی کرتا ہے۔ SUM OVER وقت کے ساتھ ساتھ فی گاہک چلانے والے کل کو پیدا کرتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔