Window Functions DB2-সহ বিভিন্ন রিলেশনাল ডেটাবেস ম্যানেজমেন্ট সিস্টেম (RDBMS) এ ব্যবহৃত একটি শক্তিশালী ফিচার যা কুয়েরি ফলাফলগুলির উপর আরো জটিল বিশ্লেষণ করতে সাহায্য করে। এটি সাধারণত অ্যাকগ্রিগেট ফাংশন (যেমন SUM, COUNT, AVG) এর সাথে ব্যবহার করা হয়, কিন্তু পার্থক্য হলো, Window Functions আপনাকে কুয়েরি ফলাফলের একটি নির্দিষ্ট "window" বা সেগমেন্টে অপারেশন চালানোর সুযোগ দেয়, তবে এটি গ্রুপিং করার পরিবর্তে পুরো ডেটাসেটের মধ্যে কাজ করে।
Window Functions আপনাকে একটি নির্দিষ্ট উইন্ডো বা অংশে কাজ করতে সহায়তা করে, যার মধ্যে পুরো রেকর্ড সেটটি অন্তর্ভুক্ত থাকে। এটি ডেটাকে বিশ্লেষণ করতে ব্যবহৃত হয়, যেমন একটি সারির মধ্যে মোট বা গড় মান বের করা, পরবর্তী বা পূর্ববর্তী সারির মান খুঁজে বের করা, বা কোনও অর্ডার অনুযায়ী রানকিং তৈরি করা।
Window Function সাধারণত একটি OVER
ক্লজের সাথে ব্যবহার করা হয়, যার মাধ্যমে আপনি কুয়েরি ফলাফলগুলোকে একটি উইন্ডোতে বিভক্ত করতে পারেন।
ROW_NUMBER() ফাংশন ব্যবহার করা হয় প্রতিটি রেকর্ডের জন্য একটি ইউনিক সংখ্যা প্রদান করতে, যা সাধারণত কোন নির্দিষ্ট অর্ডার অনুসারে দেয়া হয়।
উদাহরণ: ধরা যাক, আপনি একটি টেবিল থেকে প্রতিটি বিভাগের কর্মচারীকে তাদের বেতন অনুসারে রাঙ্ক দিতে চান।
SELECT employee_id, department_id, salary,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
FROM employees;
এটি প্রতিটি বিভাগের কর্মচারীদের বেতন অনুসারে রাঙ্ক প্রদান করবে।
RANK() ফাংশন ROW_NUMBER() এর মতো কাজ করে, তবে এটি সমমানের ডেটার জন্য সমান রাঙ্ক প্রদান করে। অর্থাৎ, যদি দুটি রেকর্ডের বেতন সমান হয়, তবে উভয়ের জন্য একই রাঙ্ক প্রদান করবে এবং পরবর্তী রাঙ্কটি একটি স্কিপ করা হবে।
উদাহরণ:
SELECT employee_id, salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
এটি সমস্ত কর্মচারীর বেতন অনুসারে রাঙ্ক প্রদান করবে, তবে সমমানের বেতন থাকলে তাদের জন্য একই রাঙ্ক প্রদান করবে।
DENSE_RANK() ফাংশন RANK() এর মতোই কাজ করে, তবে এতে কোনো স্কিপিং হয়নি। অর্থাৎ, যদি দুটি রেকর্ডের বেতন সমান হয়, তবে তাদের জন্য এক রাঙ্ক দেওয়া হবে এবং পরবর্তী রাঙ্কটি স্বাভাবিকভাবে চলতে থাকবে।
উদাহরণ:
SELECT employee_id, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
এটি সমমানের বেতন থাকা কর্মচারীদের জন্য একই রাঙ্ক প্রদান করবে এবং পরবর্তী রাঙ্কটি অক্ষুণ্ণ থাকবে।
NTILE() ফাংশন ব্যবহার করে, আপনি ডেটাকে নির্দিষ্ট সংখ্যক গ্রুপে ভাগ করতে পারেন। এটি সাধারণত ডেটা বন্টন বা ডেটার ভাগ ব্যবহার করতে ব্যবহৃত হয়।
উদাহরণ: ধরা যাক, আপনি কর্মচারীদের বেতনকে ৪টি গ্রুপে ভাগ করতে চান (পার্থক্য হিসেবে quartiles
):
SELECT employee_id, salary,
NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;
এটি বেতন অনুসারে কর্মচারীদের ৪টি গ্রুপে ভাগ করবে।
SUM() ফাংশন সাধারণত অ্যাগ্রিগেট ফাংশন হিসেবে ব্যবহৃত হয়, তবে আপনি এটি OVER ক্লজের সাথে ব্যবহার করে উইন্ডো ফাংশন হিসেবে ব্যবহার করতে পারেন। এটি আপনি যেকোনো কলামের উপর রান করতে পারেন এবং সেটি গ্রুপিং ছাড়াই অ্যাগ্রিগেট ভ্যালু দিবে।
উদাহরণ:
SELECT department_id, salary,
SUM(salary) OVER (PARTITION BY department_id) AS department_total_salary
FROM employees;
এটি প্রতিটি কর্মচারীর জন্য তার বিভাগের মোট বেতন দেখাবে, কিন্তু GROUP BY ব্যবহার না করেই। প্রতিটি রেকর্ডের জন্য বিভাগের মোট বেতন হিসাব করা হবে।
AVG() ফাংশনও উইন্ডো ফাংশন হিসেবে ব্যবহৃত হতে পারে, এবং এটি গ্রুপিং ছাড়াই সেগমেন্টের গড় মান বের করতে সহায়তা করে।
উদাহরণ:
SELECT employee_id, salary,
AVG(salary) OVER (PARTITION BY department_id) AS avg_department_salary
FROM employees;
এটি প্রতিটি কর্মচারীর জন্য তার বিভাগের গড় বেতন দেখাবে।
LEAD() এবং LAG() ফাংশন দুটি পরবর্তী বা পূর্ববর্তী রেকর্ডের মান ফেরত দেয়, যা আপনি যখন পরবর্তী বা পূর্ববর্তী রেকর্ডের সাথে তুলনা করতে চান তখন উপকারী হয়।
LEAD() উদাহরণ:
SELECT employee_id, salary,
LEAD(salary, 1) OVER (ORDER BY salary) AS next_salary
FROM employees;
এটি বর্তমান কর্মচারীর বেতন এবং পরবর্তী কর্মচারীর বেতন দেখাবে।
LAG() উদাহরণ:
SELECT employee_id, salary,
LAG(salary, 1) OVER (ORDER BY salary) AS previous_salary
FROM employees;
এটি বর্তমান কর্মচারীর বেতন এবং পূর্ববর্তী কর্মচারীর বেতন দেখাবে।
Window Functions DB2-এ ডেটাবেস অপারেশনকে আরও শক্তিশালী এবং নমনীয় করে তোলে। এগুলো আপনাকে কুয়েরি রেজাল্টের মধ্যে বিশ্লেষণাত্মক ক্যালকুলেশন, গ্রুপিং, রাঙ্কিং, এবং ডেটার সেম্যান্টিক সম্পর্ক তৈরি করার সুযোগ দেয়। ROW_NUMBER(), RANK(), LEAD(), LAG(), NTILE(), SUM(), AVG(), এবং DENSE_RANK() সহ আরও অনেক উইন্ডো ফাংশন ব্যবহারের মাধ্যমে, আপনি ডেটার উপর গভীর বিশ্লেষণ এবং পরবর্তী প্রক্রিয়াকরণ সহজভাবে সম্পন্ন করতে পারবেন।
common.read_more