การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1868 (Value INT);
mysql> INSERT INTO DemoTable1868 VALUES(10), (20), (30), (40);
คำนวณ Running Total (ค่าสะสม)
mysql> SELECT
Value,
(@iterator := Value + @iterator) AS SecondColumn
FROM DemoTable1868, (SELECT @iterator := 0) tbl;
ผลลัพธ์:
+-------+--------------+
| Value | SecondColumn |
+-------+--------------+
| 10 | 10 |
| 20 | 30 |
| 30 | 60 |
| 40 | 100 |
+-------+--------------+
การทำงาน
(SELECT @iterator := 0) tblInitializes variable @iterator = 0- Cross Join (Comma) ทำให้ Variable พร้อมใช้ในแถวแรก
@iterator := Value + @iteratorอัปเดตและคืนค่าใหม่ในแต่ละแถว- ลำดับแถวสำคัญ: ต้องมี ORDER BY หากต้องการลำดับเฉพาะ
เพิ่ม ORDER BY ให้ชัดเจน
SELECT Value, (@iterator := Value + @iterator) AS RunningTotal
FROM DemoTable1868, (SELECT @iterator := 0) init
ORDER BY Id; -- สมมติมี Id Column
MySQL 8.0+: ใช้ Window Function (แนะนำ)
SELECT
Value,
SUM(Value) OVER (ORDER BY Id ROWS UNBOUNDED PRECEDING) AS RunningTotal
FROM DemoTable1868;
ข้อได้เปรียบของ Window Function
- เป็น Standard SQL
- ไม่ต้องพึ่ง Variable (Thread-safe)
- รองรับ Frame Clause (RANGE/ROWS BETWEEN)
- ทำงานถูกต้องใน Subquery/CTE
- Optimizer จัดการได้ดีกว่า
ตัวอย่าง Window Functions อื่นๆ
-- Moving Average 3 rows
AVG(Value) OVER (ORDER BY Id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
-- Rank
RANK() OVER (ORDER BY Value DESC)
-- Lead/Lag (ค่าก่อน/หลัง)
LAG(Value) OVER (ORDER BY Id) AS PrevValue
LEAD(Value) OVER (ORDER BY Id) AS NextValue