ডুপ্লিকেট রো বাদ দিয়ে শুধু অনন্য (distinct) মানগুলোর গড় বের করতে AVG(DISTINCT column) বা সাবকোয়েরি ব্যবহার করা হয়।
টেবিল ও ডেটা তৈরি
mysql> CREATE TABLE DemoTable1934 (
StudentName VARCHAR(20),
StudentMarks INT
);
mysql> INSERT INTO DemoTable1934 VALUES
('Chris', 56), ('Chris', 56), ('David', 78), ('David', 78), ('Carol', 45);
ডেটা যাচাই
mysql> SELECT * FROM DemoTable1934;
+-------------+--------------+ | StudentName | StudentMarks | +-------------+--------------+ | Chris | 56 | | Chris | 56 | | David | 78 | | David | 78 | | Carol | 45 | +-------------+--------------+
পদ্ধতি ১: সাবকোয়েরি দিয়ে DISTINCT ROW-এ AVG
mysql> SELECT AVG(tbl.StudentMarks)
FROM (
SELECT DISTINCT StudentName, StudentMarks
FROM DemoTable1934
) AS tbl;
আউটপুট: 59.6667 (৫৬, ৭৮, ৪৫ এর গড়)
পদ্ধতি ২: AVG(DISTINCT ...) — শুধু কলাম মান ভিন্ন হলে
SELECT AVG(DISTINCT StudentMarks) FROM DemoTable1934;
ফলাফল: একই (৫৬, ৭৮, ৪৫ এর গড়)। কিন্তু এটি **কলাম লেভেলে** ডিস্টিংクト করে, রো লেভেলে নয়। যদি `('Chris',56)` এবং `('David',56)` থাকে, তবে `AVG(DISTINCT StudentMarks)` ৫৬ একবারই গুনবে — যা চাওয়া ফলাফল নাও হতে পারে।
কোনটি ব্যবহার করবেন?
- সাবকোয়েরি (পদ্ধতি ১): যখন পুরো রো (কলাম কম্বিনেশন) ডিস্টিংクト করতে চান। নিরাপদ ও স্পষ্ট।
- AVG(DISTINCT col): শুধু সেটি কলামের অনন্য মানের গড় দরকার হলে।
পারফরম্যান্স
সাবকোয়েরি একটি টেম্পোরারি টেবিল তৈরি করতে পারে। বড় ডেটাসেটে ইন্ডেক্স `(StudentName, StudentMarks)` দিয়ে অপ্টিমাইজ করুন।