Window Functions এবং ব্যবহার

Database Tutorials - ডিবি২ (DB2) DB2 Advanced SQL Techniques |
244
244

Window Functions DB2-সহ বিভিন্ন রিলেশনাল ডেটাবেস ম্যানেজমেন্ট সিস্টেম (RDBMS) এ ব্যবহৃত একটি শক্তিশালী ফিচার যা কুয়েরি ফলাফলগুলির উপর আরো জটিল বিশ্লেষণ করতে সাহায্য করে। এটি সাধারণত অ্যাকগ্রিগেট ফাংশন (যেমন SUM, COUNT, AVG) এর সাথে ব্যবহার করা হয়, কিন্তু পার্থক্য হলো, Window Functions আপনাকে কুয়েরি ফলাফলের একটি নির্দিষ্ট "window" বা সেগমেন্টে অপারেশন চালানোর সুযোগ দেয়, তবে এটি গ্রুপিং করার পরিবর্তে পুরো ডেটাসেটের মধ্যে কাজ করে।


Window Functions কী?

Window Functions আপনাকে একটি নির্দিষ্ট উইন্ডো বা অংশে কাজ করতে সহায়তা করে, যার মধ্যে পুরো রেকর্ড সেটটি অন্তর্ভুক্ত থাকে। এটি ডেটাকে বিশ্লেষণ করতে ব্যবহৃত হয়, যেমন একটি সারির মধ্যে মোট বা গড় মান বের করা, পরবর্তী বা পূর্ববর্তী সারির মান খুঁজে বের করা, বা কোনও অর্ডার অনুযায়ী রানকিং তৈরি করা।

Window Function সাধারণত একটি OVER ক্লজের সাথে ব্যবহার করা হয়, যার মাধ্যমে আপনি কুয়েরি ফলাফলগুলোকে একটি উইন্ডোতে বিভক্ত করতে পারেন।


Window Functions এর প্রধান উপাদান

  1. PARTITION BY: এটি ডেটাকে বিভিন্ন গ্রুপ বা উইন্ডোতে ভাগ করে, যার মাধ্যমে আপনি গ্রুপ অনুযায়ী অপারেশন করতে পারেন।
  2. ORDER BY: এটি রেকর্ডগুলোকে কোনো নির্দিষ্ট অর্ডারে সাজানোর জন্য ব্যবহৃত হয়, যাতে আপনি সঠিকভাবে উইন্ডো ফাংশন প্রয়োগ করতে পারেন।
  3. ROWS BETWEEN: উইন্ডো ফাংশনের সীমানা নির্ধারণ করতে ব্যবহৃত হয় (যেমন আগের ৫টি রেকর্ড বা পরের ১০টি রেকর্ড)।

Window Functions এর ব্যবহার

১. ROW_NUMBER()

ROW_NUMBER() ফাংশন ব্যবহার করা হয় প্রতিটি রেকর্ডের জন্য একটি ইউনিক সংখ্যা প্রদান করতে, যা সাধারণত কোন নির্দিষ্ট অর্ডার অনুসারে দেয়া হয়।

উদাহরণ: ধরা যাক, আপনি একটি টেবিল থেকে প্রতিটি বিভাগের কর্মচারীকে তাদের বেতন অনুসারে রাঙ্ক দিতে চান।

SELECT employee_id, department_id, salary,
       ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
FROM employees;

এটি প্রতিটি বিভাগের কর্মচারীদের বেতন অনুসারে রাঙ্ক প্রদান করবে।

২. RANK()

RANK() ফাংশন ROW_NUMBER() এর মতো কাজ করে, তবে এটি সমমানের ডেটার জন্য সমান রাঙ্ক প্রদান করে। অর্থাৎ, যদি দুটি রেকর্ডের বেতন সমান হয়, তবে উভয়ের জন্য একই রাঙ্ক প্রদান করবে এবং পরবর্তী রাঙ্কটি একটি স্কিপ করা হবে।

উদাহরণ:

SELECT employee_id, salary,
       RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;

এটি সমস্ত কর্মচারীর বেতন অনুসারে রাঙ্ক প্রদান করবে, তবে সমমানের বেতন থাকলে তাদের জন্য একই রাঙ্ক প্রদান করবে।

৩. DENSE_RANK()

DENSE_RANK() ফাংশন RANK() এর মতোই কাজ করে, তবে এতে কোনো স্কিপিং হয়নি। অর্থাৎ, যদি দুটি রেকর্ডের বেতন সমান হয়, তবে তাদের জন্য এক রাঙ্ক দেওয়া হবে এবং পরবর্তী রাঙ্কটি স্বাভাবিকভাবে চলতে থাকবে।

উদাহরণ:

SELECT employee_id, salary,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

এটি সমমানের বেতন থাকা কর্মচারীদের জন্য একই রাঙ্ক প্রদান করবে এবং পরবর্তী রাঙ্কটি অক্ষুণ্ণ থাকবে।

৪. NTILE()

NTILE() ফাংশন ব্যবহার করে, আপনি ডেটাকে নির্দিষ্ট সংখ্যক গ্রুপে ভাগ করতে পারেন। এটি সাধারণত ডেটা বন্টন বা ডেটার ভাগ ব্যবহার করতে ব্যবহৃত হয়।

উদাহরণ: ধরা যাক, আপনি কর্মচারীদের বেতনকে ৪টি গ্রুপে ভাগ করতে চান (পার্থক্য হিসেবে quartiles):

SELECT employee_id, salary,
       NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;

এটি বেতন অনুসারে কর্মচারীদের ৪টি গ্রুপে ভাগ করবে।

৫. SUM() with OVER

SUM() ফাংশন সাধারণত অ্যাগ্রিগেট ফাংশন হিসেবে ব্যবহৃত হয়, তবে আপনি এটি OVER ক্লজের সাথে ব্যবহার করে উইন্ডো ফাংশন হিসেবে ব্যবহার করতে পারেন। এটি আপনি যেকোনো কলামের উপর রান করতে পারেন এবং সেটি গ্রুপিং ছাড়াই অ্যাগ্রিগেট ভ্যালু দিবে।

উদাহরণ:

SELECT department_id, salary,
       SUM(salary) OVER (PARTITION BY department_id) AS department_total_salary
FROM employees;

এটি প্রতিটি কর্মচারীর জন্য তার বিভাগের মোট বেতন দেখাবে, কিন্তু GROUP BY ব্যবহার না করেই। প্রতিটি রেকর্ডের জন্য বিভাগের মোট বেতন হিসাব করা হবে।

৬. AVG() with OVER

AVG() ফাংশনও উইন্ডো ফাংশন হিসেবে ব্যবহৃত হতে পারে, এবং এটি গ্রুপিং ছাড়াই সেগমেন্টের গড় মান বের করতে সহায়তা করে।

উদাহরণ:

SELECT employee_id, salary,
       AVG(salary) OVER (PARTITION BY department_id) AS avg_department_salary
FROM employees;

এটি প্রতিটি কর্মচারীর জন্য তার বিভাগের গড় বেতন দেখাবে।

৭. LEAD() এবং LAG()

LEAD() এবং LAG() ফাংশন দুটি পরবর্তী বা পূর্ববর্তী রেকর্ডের মান ফেরত দেয়, যা আপনি যখন পরবর্তী বা পূর্ববর্তী রেকর্ডের সাথে তুলনা করতে চান তখন উপকারী হয়।

  • 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.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion