মূল কন্টেন্টে যান
মডিউল 7 · 3-এর পাঠ 4কোর্সে 27/57~12 min
মডিউল পাঠ (3/4)

ল্যাগ, লিড এবং চলমান মোট

LAG এবং LEAD দুটি বিশেষ উইন্ডো ফাংশন যা আপনাকে অ্যাক্সেস দেয় একই পার্টিশনের অন্যান্য সারি: আগের সারি (LAG) বা উইন্ডোর ORDER BY অনুযায়ী পরেরটি (LEAD)। তারা হল সারি-থেকে-সারি তুলনা (ডেল্টা, বৈচিত্র, ব্যবধান) এর জন্য গো-টু টুল এবং — 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 আছে কারণ পার্টিশনে কোন "আগের" নেই।

LEAD: পরবর্তী সারি

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;

রানিং টোটাল: ওভার সহ সমষ্টি

সমষ্টিগত ফাংশন (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 কলাম দেখান যা বর্তমান অর্ডার এবং আগের এক গ্রাহকের মধ্যে পুরো দিনের সংখ্যা (FLOOR সহ), অর্ডার করা_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লোড হচ্ছে...

প্রতিটি ডেলিভারি অর্ডারের জন্য (স্ট্যাটাস = 'ডেলিভারড'), আইডি, কাস্টমার_আইডি, অর্ডার করা_অ্যাট, অর্ডার_টোটাল (এর লাইন আইটেমের পরিমাণ * ইউনিট_মূল্যের যোগফল) এবং রানিং_টোটাল (অর্ডার করা_অ্যাট দ্বারা অর্ডারকৃত প্রতি গ্রাহকের মোটের মোট চলমান)। অর্ডার_টোটালের জন্য একটি CTE ব্যবহার করুন। customer_id এবং ordered_at দ্বারা অর্ডার করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

CTE অর্ডার প্রতি মোট গণনা করে; SUM OVER সময়ের সাথে প্রতি গ্রাহকের চলমান মোট উৎপাদন করে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ