MySQL-এ CROSS JOIN এবং সেশন ভেরিয়েবল (@variable) ব্যবহার করে প্রতিটি রোয়ের সাথে পূর্বের রোগুলোর যোগফল (running total) ক্যালকুলেট করা যায়।
উদাহরণ: টেবিল তৈরি এবং ডেটা ইনসার্ট
mysql> create table DemoTable(Value int); Query OK, 0 rows affected (1.79 sec)
mysql> insert into DemoTable values(50); Query OK, 1 row affected (0.24 sec) mysql> insert into DemoTable values(20); Query OK, 1 row affected (0.68 sec) mysql> insert into DemoTable values(30); Query OK, 1 row affected (0.18 sec)
সকল রেকর্ড দেখানো
mysql> select * from DemoTable;
+-------+ | Value | +-------+ | 50 | | 20 | | 30 | +-------+ 3 rows in set (0.00 sec)
CROSS JOIN দিয়ে রানিং টোটাল (Value অনুযায়ী সর্টেড)
mysql> select t.Value,
(@s := @s + t.Value) as Number
from DemoTable t cross join
(select @s := 0) p
order by t.Value;
+-------+--------+ | Value | Number | +-------+--------+ | 20 | 20 | | 30 | 50 | | 50 | 100 | +-------+--------+ 3 rows in set (0.07 sec)
ব্যাখ্যা
CROSS JOIN (SELECT @s := 0) p- সেশন ভেরিয়েবল@s০ দিয়ে ইনিশিয়ালাইজ করেORDER BY t.Value- মান অনুযায়ী সর্ট করে (২০, ৩০, ৫০)@s := @s + t.Value- প্রতিটি রোতে বর্তমান Value যোগ করে @s আপডেট করেNumber- আউটপুট কলাম এলিয়াস
মডার্ন পদ্ধতি (MySQL 8.0+): Window Function
SELECT Value,
SUM(Value) OVER (ORDER BY Value) as RunningTotal
FROM DemoTable;
+-------+--------------+ | Value | RunningTotal | +-------+--------------+ | 20 | 20 | | 30 | 50 | | 50 | 100 | +-------+--------------+
তুলনা
| দিক | CROSS JOIN + Variable | Window Function |
|---|---|---|
| MySQL ভার্সন | সব ভার্সন | 8.0+ |
| পঠনযোগ্যতা | কম | উচ্চ |
| পারফরম্যান্স | মাঝারি | ভালো (অপ্টিমাইজড) |
| ফিচার | সিম্পল | PARTITION BY, FRAME ইত্যাদি |