SQL Server: Function LAG

ต่อจากบทความเรื่อง 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 คือพระเอกที่คุณขาดไม่ได้เลยครับ!


อ่านเพิ่มเติม