ในงานวิเคราะห์ข้อมูลเชิงลึก (Advanced Data Analytics) โดยเฉพาะอย่างยิ่งข้อมูลอนุกรมเวลา (Time Series) หรือการวิเคราะห์แนวโน้มทางธุรกิจ การทราบเพียงแค่ค่าปัจจุบันของข้อมูลนั้นไม่เพียงพอ เรามักจำเป็นต้องเปรียบเทียบค่าปัจจุบันกับค่าที่เกิดขึ้นก่อนหน้า (Previous) หรือค่าที่จะเกิดขึ้นถัดไป (Next) เพื่อคำนวณอัตราการเปลี่ยนแปลง (Rate of Change) หรือส่วนต่าง (Difference) การใช้คำสั่ง SQL แบบดั้งเดิม เช่น Self-Join อาจทำได้ แต่ก็มักจะซับซ้อนและมีประสิทธิภาพต่ำกว่า
นี่คือจุดที่ฟังก์ชัน Window Function อย่าง LEAD() และ LAG() เข้ามามีบทบาทสำคัญ ฟังก์ชันเหล่านี้ถูกออกแบบมาเพื่อจัดการกับบริบทของข้อมูลในรูปแบบลำดับ (Sequential Context) โดยเฉพาะ ทำให้การเปรียบเทียบข้อมูลระหว่างแถว (Row-to-Row Comparison) เป็นเรื่องที่ง่ายและมีประสิทธิภาพสูงในระบบ PostgreSQL
หลักการทำงานของ LEAD() และ LAG() ใน PostgreSQL
LEAD() และ LAG() เป็นฟังก์ชันที่ทำงานร่วมกับ Window Function โดยมีหน้าที่ในการ ‘มอง’ ข้ามแถวเพื่อดึงค่าจากบริบทข้างเคียงมาใช้งาน:
LAG(column, offset, default): ใช้สำหรับมองย้อนกลับ (Lagging) เพื่อดึงค่าของคอลัมน์จากแถวที่อยู่ก่อนหน้า (Previous Row) เหมาะสำหรับการเปรียบเทียบกับข้อมูลในอดีต เช่น ยอดขายเดือนที่แล้วLEAD(column, offset, default): ใช้สำหรับมองข้ามไปข้างหน้า (Leading) เพื่อดึงค่าของคอลัมน์จากแถวที่อยู่ถัดไป (Next Row) เหมาะสำหรับการคาดการณ์หรือการเปรียบเทียบกับข้อมูลในอนาคต
หัวใจสำคัญของการทำงานคือไวยากรณ์ OVER(PARTITION BY ... ORDER BY ...) ซึ่งกำหนดขอบเขตของ ‘หน้าต่าง’ (Window) ที่ฟังก์ชันจะทำงาน:
ORDER BY: บังคับให้ระบบเรียงลำดับข้อมูลก่อนทำการเปรียบเทียบ (สำคัญที่สุดในการกำหนดลำดับเวลา)PARTITION BY: (ทางเลือก) ใช้แบ่งกลุ่มข้อมูลออกเป็นส่วนย่อยๆ (Partitions) เพื่อให้การเปรียบเทียบเกิดขึ้นภายในกลุ่มเดียวกันเท่านั้น (เช่น เปรียบเทียบยอดขายของสินค้า A เทียบกับยอดขายเดือนที่แล้วของสินค้า A เท่านั้น)
ตัวอย่างการใช้งานจริง: การคำนวณส่วนต่างยอดขาย
สมมติว่าเรามีตาราง sales_data ที่บันทึกยอดขายรายเดือน เราต้องการทราบว่ายอดขายเดือนปัจจุบันแตกต่างจากเดือนที่แล้วเท่าไหร่:
SQL
WITH sales_data AS (
SELECT '2023-01-01'::date AS sale_date, 1000 AS amount UNION ALL
SELECT '2023-02-01'::date, 1200 UNION ALL
SELECT '2023-03-01'::date, 1500 UNION ALL
SELECT '2023-04-01'::date, 1400
)
SELECT
sale_date,
amount AS current_amount,
LAG(amount, 1) OVER (ORDER BY sale_date) AS previous_amount,
amount - LAG(amount, 1) OVER (ORDER BY sale_date) AS difference
FROM
sales_data
ORDER BY
sale_date;
ผลลัพธ์ที่ได้: แถวแรกจะมีค่า previous_amount เป็น NULL (เนื่องจากไม่มีข้อมูลก่อนหน้า) ส่วนแถวถัดไปจะแสดงการคำนวณส่วนต่างที่แม่นยำ เช่น เดือนมีนาคม (1500) ลบด้วยเดือนกุมภาพันธ์ (1200) ได้ส่วนต่าง 300
สรุปและข้อได้เปรียบในการใช้งาน
การใช้ LEAD() และ LAG() ไม่เพียงแต่เป็นทางเลือก แต่เป็นมาตรฐานในการวิเคราะห์ข้อมูลเชิงเวลาในระดับมืออาชีพ ด้วยประสิทธิภาพที่เหนือกว่าการใช้ Self-Join และความชัดเจนของโค้ด ทำให้การคำนวณเมตริกที่ซับซ้อน เช่น Year-over-Year Growth, Month-over-Month Change หรือการหาค่าเฉลี่ยเคลื่อนที่ (Moving Average) เป็นเรื่องที่ทำได้อย่างรวดเร็วและเชื่อถือได้ใน PostgreSQL การทำความเข้าใจ Window Functions เหล่านี้จึงเป็นทักษะสำคัญสำหรับ Data Engineer และ Data Analyst ระดับสูง