GORAGOD.com

การใช้ฟังก์ชัน LAG() ใน MySQL

การใช้ฟังก์ชัน LAG() ใน MySQL สามารถช่วยให้คุณดึงข้อมูลจากแถวก่อนหน้ามาใช้งานได้ ในกรณีที่คุณต้องการดูค่าของฟิลด์ในแถวก่อนหน้าในผลลัพธ์ของคุณ เช่น การคำนวณการเปลี่ยนแปลงของค่าในแถวปัจจุบันเทียบกับแถวก่อนหน้า

ตัวอย่างการใช้งาน LAG() ใน MySQL

สมมติว่าคุณมีตาราง sales ดังนี้
CREATE TABLE sales (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sale_date DATE,
    amount DECIMAL(10, 2)
);

INSERT INTO sales (sale_date, amount) VALUES
('2023-01-01', 100.00),
('2023-01-02', 150.00),
('2023-01-03', 200.00),
('2023-01-04', 250.00),
('2023-01-05', 300.00);
sql
ตอนนี้คุณต้องการดูการเปลี่ยนแปลงของยอดขายแต่ละวันเมื่อเทียบกับวันก่อนหน้า คุณสามารถใช้ฟังก์ชัน LAG() ดังนี้
SELECT 
    sale_date,
    amount,
    LAG(amount) OVER (ORDER BY sale_date) AS previous_amount,
    amount - LAG(amount) OVER (ORDER BY sale_date) AS change_amount
FROM 
    sales;

ผลลัพธ์จะเป็น
+------------+--------+-----------------+--------------+
| sale_date  | amount | previous_amount | change_amount|
+------------+--------+-------- --------+--------------+
| 2023-01-01 | 100.00 |            NULL |         NULL |
| 2023-01-02 | 150.00 |          100.00 |        50.00 |
| 2023-01-03 | 200.00 |          150.00 |        50.00 |
| 2023-01-04 | 250.00 |          200.00 |        50.00 |
| 2023-01-05 | 300.00 |          250.00 |        50.00 |
+------------+--------+----------------+--------------+

ในตัวอย่างนี้
  • LAG(amount) OVER (ORDER BY sale_date) จะดึงค่าของ amount จากแถวก่อนหน้าโดยเรียงลำดับตาม sale_date
  • amount - LAG(amount) OVER (ORDER BY sale_date) จะคำนวณการเปลี่ยนแปลงของยอดขายแต่ละวันเทียบกับวันก่อนหน้า
คุณสามารถปรับแต่งการใช้งาน LAG() ได้ตามต้องการโดยใช้พารามิเตอร์ต่างๆ ของฟังก์ชัน เช่น ระบุว่าคุณต้องการดูค่าในแถวที่ห่างออกไปกี่แถว (ค่า default คือ 1) หรือระบุค่า default ในกรณีที่ไม่มีแถวก่อนหน้า

LAG() มีใน MySQL เวอร์ชั่นไหน
ฟังก์ชัน LAG() ถูกเพิ่มเข้ามาใน MySQL ตั้งแต่เวอร์ชัน 8.0 เป็นต้นไป ดังนั้น หากคุณต้องการใช้ฟังก์ชันนี้ คุณจำเป็นต้องใช้ MySQL 8.0 หรือเวอร์ชันที่ใหม่กว่า
ฟังก์ชัน LAG() เป็นฟังก์ชันหน้าต่าง (Window Function) ที่ช่วยให้คุณสามารถเข้าถึงค่าของแถวก่อนหน้าในชุดผลลัพธ์ได้ ซึ่งทำให้การคำนวณค่าเปลี่ยนแปลงหรือการเปรียบเทียบระหว่างแถวทำได้ง่ายขึ้นมาก
หากคุณใช้งาน MySQL เวอร์ชันที่เก่ากว่า 8.0 คุณอาจต้องใช้วิธีการอื่นในการคำนวณ เช่น การใช้ subquery หรือการ join ตารางตัวเอง ซึ่งจะซับซ้อนและทำงานช้ากว่า
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน LAG() ใน MySQL คุณสามารถดูได้ที่ MySQL 8.0 Reference Manual