ต่อจากบทความเรื่อง LEAD คราวนี้เรามาทำความรู้จักกับคู่หูของมันอย่าง LAG กันครับ ถ้า LEAD คือการ “มองไปข้างหน้า” LAG ก็คือการ “มองย้อนกลับไปข้างหลัง” นั่นเอง
ฟังก์ชันนี้มีประโยชน์มากในการทำรายงานเปรียบเทียบแนวโน้ม เช่น การวัดผลต่างยอดขายจากเดือนที่แล้ว หรือการดูระยะเวลาห่างระหว่าง Order ปัจจุบันกับ Order ก่อนหน้า
LAG คืออะไร ?
LAG คือ Window Function ที่ใช้สำหรับเข้าถึงข้อมูลในแถวที่อยู่ “ก่อนหน้า” แถวปัจจุบัน โดยที่เราไม่ต้องทำ Self-join ให้ซับซ้อน
ไวยากรณ์ (Syntax)
LAG
OVER
- scalar_expression: ชื่อคอลัมน์ที่ต้องการดึงค่ามาแสดง
- offset: จำนวนแถวที่ต้องการถอยหลังไป
- default: ค่าที่จะให้แสดงหากไม่มีแถวก่อนหน้า มักใส่เป็น 0 หรือ NULL
- ORDER BY: เพื่อกำหนดลำดับว่า “ก่อนหน้า” คือแถวไหน
ตัวอย่างการใช้งาน: เปรียบเทียบยอดขายรายวัน
สมมติเรามีตารางยอดขายรายวัน และต้องการคำนวณว่าวันนี้ขายได้ “มากกว่าหรือน้อยกว่าเมื่อวาน” เท่าไหร่
SELECT
SaleDate,
Amount AS TodaySales,
LAG (Amount, 1, 0) OVER (ORDER BY SaleDate) AS YesterdaySales,
Amount - LAG (Amount, 1, 0) OVER (ORDER BY SaleDate) AS Difference
FROM DailySales;
ผลลัพธ์ที่ได้
| SaleDate | TodaySales | YesterdaySales | Difference |
| :--- | :--- | :--- | :--- |
| 2024-01-01 | 1000 | 0 | 1000 |
| 2024-01-02 | 1200 | 1000 | 200 |
| 2024-01-03 | 1100 | 1200 | -100 |
การใช้ PARTITION BY
หากข้อมูลของคุณมีการแบ่งหมวดหมู่ เช่น ยอดขายแยกตามประเภทสินค้า คุณต้องใช้ PARTITION BY เพื่อไม่ให้ข้อมูลของสินค้าคนละชนิดมาปนกัน
SELECT
Category,
SaleDate,
Amount,
LAG (Amount) OVER (PARTITION BY Category ORDER BY SaleDate) AS PrevAmount
FROM ProductSales;
การใช้แบบนี้จะทำให้ SQL เริ่มต้นหาค่า LAG ใหม่ทุกครั้งที่เปลี่ยน Category ครับ
เปรียบเทียบความแตกต่าง: LAG vs LEAD
เพื่อให้เห็นภาพชัดเจน ลองดูตารางเปรียบเทียบนี้ครับ
| ฟังก์ชัน | ทิศทางการดึงข้อมูล | เหมาะสำหรับ |
| LAG | ดึงจากแถว ก่อนหน้า | หา Growth Rate, เทียบยอดปีก่อน, ดูประวัติย้อนหลัง |
| LEAD | ดึงจากแถว ถัดไป | หาจุดสิ้นสุดของช่วงเวลา, ดูคิวงานถัดไป, คำนวณ Duration |
สรุป
การใช้ LAG ช่วยให้ Query ของคุณสะอาดขึ้นมาก และมีประสิทธิภาพสูงกว่าการเขียน Subquery หรือ Join ตัวเองเพื่อหาค่าก่อนหน้า
ทริคเพิ่มเติม: หากคุณต้องทำ Dashboard เปรียบเทียบ % ยอดขาย ฟังก์ชัน LAG คือพระเอกที่คุณขาดไม่ได้เลยครับ!
อ่านเพิ่มเติม