মডিউল পাঠ (3/4)
ল্যাগ, লিড এবং চলমান মোট
LAG এবং LEAD দুটি বিশেষ উইন্ডো ফাংশন যা আপনাকে অ্যাক্সেস দেয়
একই পার্টিশনের অন্যান্য সারি: আগের সারি (LAG) বা
উইন্ডোর ORDER BY অনুযায়ী পরেরটি (LEAD)। তারা হল
সারি-থেকে-সারি তুলনা (ডেল্টা, বৈচিত্র, ব্যবধান) এর জন্য গো-টু টুল
এবং — 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 আছে কারণ
পার্টিশনে কোন "আগের" নেই।
LEAD: পরবর্তী সারি
LAG এর আয়না। সাধারণ: "পরবর্তী ইভেন্ট পর্যন্ত সময়", "পার্থক্য
পরবর্তী সংস্করণের সাথে"।
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 …) এর সাথে মিলিত হয়:
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 কলাম দেখান যা বর্তমান অর্ডার এবং আগের এক গ্রাহকের মধ্যে পুরো দিনের সংখ্যা (FLOOR সহ), অর্ডার করা_at দ্বারা অর্ডার করা হয়েছে। পূর্ববর্তী কোনো আদেশ না থাকলে NULL। customer_id এবং ordered_at দ্বারা অর্ডার করুন।
ইঙ্গিত দেখান
LAG(ordered_at) OVER (partiTION by customer_id ORDER BY ordered_at) গ্রাহকের আগের অর্ডারের টাইমস্ট্যাম্প ফেরত দেয়। একটি INTERVAL পেতে বিয়োগ করুন, তারপর দিনে রূপান্তর করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
প্রতিটি ডেলিভারি অর্ডারের জন্য (স্ট্যাটাস = 'ডেলিভারড'), আইডি, কাস্টমার_আইডি, অর্ডার করা_অ্যাট, অর্ডার_টোটাল (এর লাইন আইটেমের পরিমাণ * ইউনিট_মূল্যের যোগফল) এবং রানিং_টোটাল (অর্ডার করা_অ্যাট দ্বারা অর্ডারকৃত প্রতি গ্রাহকের মোটের মোট চলমান)। অর্ডার_টোটালের জন্য একটি CTE ব্যবহার করুন। customer_id এবং ordered_at দ্বারা অর্ডার করুন।
ইঙ্গিত দেখান
CTE অর্ডার প্রতি মোট গণনা করে; SUM OVER সময়ের সাথে প্রতি গ্রাহকের চলমান মোট উৎপাদন করে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ