ป้ายกำกับ: Toctou

SQL Server: Function LAGSQL Server: Function LAG

ในโลกของการวิเคราะห์ข้อมูล (Data Analysis) การเปรียบเทียบข้อมูลระหว่างช่วงเวลาที่แตกต่างกันเป็นสิ่งสำคัญอย่างยิ่ง ไม่ว่าจะเป็นการวัดการเติบโตของยอดขายรายเดือน หรือการหาความแตกต่างของคะแนนสอบระหว่างครั้ง

เมื่อเราพูดถึงการเปรียบเทียบข้อมูลที่อยู่ติดกันในชุดข้อมูล (Sequential Data) ฟังก์ชัน LAG() คือเครื่องมือทรงพลังที่ทำหน้าที่เหมือนการ ‘มองย้อนกลับไปข้างหลัง’ (Look Back) เพื่อดึงค่าจากแถวก่อนหน้ามาเปรียบเทียบกับแถวปัจจุบันได้โดยตรง

หากคุณเคยเรียนรู้เรื่อง LEAD() ซึ่งใช้ในการมองไปข้างหน้า (Look Ahead) การทำความเข้าใจ LAG() จะช่วยให้คุณสามารถสร้างรายงานแนวโน้ม (Trend Analysis) ที่ซับซ้อนได้อย่างง่ายดาย โดยไม่ต้องใช้เทคนิค Self-Join ที่ยุ่งยากและมีประสิทธิภาพต่ำ


LAG คืออะไร? หลักการทำงานของ Window Function

LAG() คือ Window Function ใน PostgreSQL ที่ช่วยให้เราสามารถเข้าถึงค่าของคอลัมน์ใดคอลัมน์หนึ่งในแถวที่อยู่ก่อนหน้าแถวปัจจุบันตามลำดับที่กำหนด (Window Frame) โดยมีหลักการทำงานดังนี้:

  • หน้าที่หลัก: ดึงค่าจากแถวที่อยู่ก่อนหน้า (Previous Row)
  • ข้อดี: ง่ายกว่าการใช้ Self-Join ในการเปรียบเทียบข้อมูลตามลำดับเวลา
  • การใช้งาน: เหมาะสำหรับการคำนวณผลต่าง (Difference), การหาอัตราการเปลี่ยนแปลง (Rate of Change)

ไวยากรณ์ (Syntax) ของ LAG ใน PostgreSQL

การใช้งาน LAG ต้องอาศัยโครงสร้าง Window Function ที่ระบุคอลัมน์, ตำแหน่งการถอยหลัง, และลำดับการเรียงข้อมูล:

SQL

LAG(scalar_expression, offset, default) OVER (ORDER BY column_name);
  • scalar_expression: คอลัมน์ที่เราต้องการดึงค่ามาเปรียบเทียบ (เช่น amount)
  • offset: จำนวนแถวที่ต้องการถอยหลังไป (ค่าเริ่มต้นคือ 1 คือแถวก่อนหน้าที่สุด)
  • default: ค่าที่จะให้แสดงหากไม่มีแถวก่อนหน้า (เช่น 0 หรือ NULL)
  • OVER (ORDER BY column_name): ส่วนสำคัญที่กำหนดลำดับการคำนวณว่า ‘ก่อนหน้า’ คือแถวไหน

ตัวอย่างการใช้งาน: การเปรียบเทียบยอดขายรายวัน

สมมติว่าเรามีตาราง sales ที่บันทึกยอดขายในแต่ละวัน เราต้องการหาว่ายอดขายของวันนี้แตกต่างจากยอดขายของเมื่อวานเท่าไหร่ เราสามารถใช้ LAG() ได้ดังนี้:

SQL

-- 1. สร้างข้อมูลตัวอย่าง (Simulation) <br>CREATE TABLE sales (sale_date DATE, sale_amount INT); <br>INSERT INTO sales VALUES ('2023-10-01', 100); <br>INSERT INTO sales VALUES ('2023-10-02', 150); <br>INSERT INTO sales VALUES ('2023-10-03', 120); <br>INSERT INTO sales VALUES ('2023-10-04', 200); <br> <br>-- 2. ใช้ LAG เพื่อดึงยอดขายวันก่อนหน้า <br>SELECT <br>    sale_date, <br>    sale_amount, <br>    LAG(sale_amount, 1, 0) OVER (ORDER BY sale_date) AS previous_day_sales, <br>    sale_amount - LAG(sale_amount, 1, 0) OVER (ORDER BY sale_date) AS difference <br>FROM sales <br>ORDER BY sale_date;

ผลลัพธ์ที่ได้:

แถวแรก (2023-10-01) จะแสดง 0 ในคอลัมน์ previous_day_sales เพราะไม่มีข้อมูลก่อนหน้า (ตามค่า default ที่กำหนด) แต่แถวถัดไปจะสามารถดึงค่า 100 มาใช้เปรียบเทียบกับ 150 ได้อย่างถูกต้อง

บทสรุป

LAG() เป็นฟังก์ชันที่ขาดไม่ได้สำหรับนักวิเคราะห์ข้อมูลที่ทำงานกับข้อมูลอนุกรมเวลา (Time Series Data) การเข้าใจการทำงานของ Window Function ประเภทนี้จะช่วยให้คุณสามารถเขียน Query ที่มีประสิทธิภาพสูงในการวิเคราะห์แนวโน้ม การคำนวณส่วนต่าง หรือการเปรียบเทียบค่าระหว่างช่วงเวลาได้อย่างแม่นยำ ทำให้การทำรายงานทางธุรกิจมีความลึกและน่าเชื่อถือยิ่งขึ้น