MySQL-এ সাবকোয়েরি ব্যবহার করে ক্রমাগত যোগফল (cumulative sum) ১৫০-এর নিচে থাকা রেকর্ডগুলো বের করা যায়।
উদাহরণ: টেবিল তৈরি এবং ডেটা ইনসার্ট
mysql> create table DemoTable844(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Amount int
);
Query OK, 0 rows affected (0.95 sec)
mysql> insert into DemoTable844(Amount) values(80); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable844(Amount) values(100); Query OK, 1 row affected (0.08 sec) mysql> insert into DemoTable844(Amount) values(60); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable844(Amount) values(40); Query OK, 1 row affected (0.36 sec) mysql> insert into DemoTable844(Amount) values(150); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable844(Amount) values(24); Query OK, 1 row affected (0.40 sec)
সকল রেকর্ড দেখানো
mysql> select * from DemoTable844;
+----+--------+ | Id | Amount | +----+--------+ | 1 | 80 | | 2 | 100 | | 3 | 60 | | 4 | 40 | | 5 | 150 | | 6 | 24 | +----+--------+ 6 rows in set (0.00 sec)
ক্রমাগত যোগফল ১৫০-এর নিচে থাকা রেকর্ড (Id অনুযায়ী অর্ডার)
mysql> select * from DemoTable844 tbl
where (select sum(Amount) from DemoTable844 where Amount <= tbl.Amount order by Amount) < 150
order by Id;
+----+--------+ | Id | Amount | +----+--------+ | 3 | 60 | | 4 | 40 | | 6 | 24 |
ব্যাখ্যা
- সাবকোয়েরি:
(select sum(Amount) from DemoTable844 where Amount <= tbl.Amount order by Amount) - প্রতিটি বাহ্যিক রো (tbl) এর জন্য, সেটি থেকে ছোট বা সমান Amountवाले সকল রোর যোগফল বের করে
- যদি যোগফল < 150 হয়, তবে ওই রো সিলেক্ট হয়
ORDER BY Id- মূল টেবিলের Id অনুযায়ী ফলাফল সাজানো
দ্রষ্টব্য
এই কোয়েরিটি Amount অনুযায়ী সর্ট করে যোগফল বের করে (Id অনুযায়ী নয়)। Id ১ (Amount 80) এর জন্য যোগফল = 24+40+60+80 = 204 > 150, তাই বাদ পড়েছে।
মডার্ন পদ্ধতি (MySQL 8.0+): Window Function
SELECT Id, Amount FROM (
SELECT Id, Amount,
SUM(Amount) OVER (ORDER BY Amount ROWS UNBOUNDED PRECEDING) as RunningSum
FROM DemoTable844
) t WHERE RunningSum < 150 ORDER BY Id;