مرکزی مواد پر جائیں
ماڈیول 7 · سبق 3 از 4کورس میں 27/57~12 min
ماڈیول اسباق (3/4)

وقفہ، لیڈ اور رننگ ٹول

LAG اور LEAD دو خاص ونڈو فنکشنز ہیں جو آپ کو رسائی فراہم کرتے ہیں اسی پارٹیشن کی دیگر قطاریں: پچھلی قطار (LAG) یا اگلا ایک (LEAD) ونڈو کے ORDER BY کے مطابق۔ وہ ہیں قطار سے قطار کے موازنہ کے لیے ٹول پر جائیں (ڈیلٹا، تغیرات، وقفے) اور — SUM/AVG/COUNT OVER کے ساتھ مل کر — چلنے والے ٹوٹل کے لیے۔

LAG: پچھلی قطار

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لوڈ ہو رہا ہے…

ہر آرڈر کے لیے 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 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#sql.m7.l3.e2
کوششیں: 0لوڈ ہو رہا ہے…

ہر ڈیلیور کردہ آرڈر کے لیے (status = 'delivered')، دکھائیں id، customer_id، ordered_at، order_total (مقدار کا مجموعہ * اس کے لائن آئٹمز کی یونٹ_قیمت) اور run_total (فی گاہک کے ٹوٹل کا چل رہا ہے، ordered_at کے ذریعے آرڈر کیا گیا ہے)۔ آرڈر_کل کے لیے CTE استعمال کریں۔ customer_id اور ordered_at کے ذریعے آرڈر کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

CTE کل فی آرڈر کی گنتی کرتا ہے۔ SUM OVER وقت کے ساتھ ساتھ فی گاہک چلانے والے کل کو پیدا کرتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔