ฟังก์ชัน LEAD ใน SQL Server เป็นเครื่องมือที่ทรงพลังมากในกลุ่ม Window Functions ช่วยให้เราสามารถ “ดึงข้อมูลจากแถวถัดไป” มาแสดงในแถวปัจจุบันได้โดยไม่ต้องเขียน Self-join ให้วุ่นวายครับ
LEAD คืออะไร ?
LEAD ใช้สำหรับเข้าถึงข้อมูลในแถวที่อยู่ลำดับถัดลงไปตามเงื่อนไขที่เรากำหนด ส่วนใหญ่มักใช้ในการเปรียบเทียบค่าระหว่างบรรทัด เช่น การหาส่วนต่างของยอดขายรายวัน หรือการดูว่าขั้นตอนถัดไปในระบบ Log คืออะไร
LEAD OVER
- scalar_expression: Column ที่เราต้องการดึงค่ามา
- offset: จะให้ “กระโดด” ไปข้างหน้ากี่แถว
- default: ถ้าแถวถัดไปไม่มีข้อมูล จะให้แสดงค่าอะไร
- ORDER BY: เพื่อบอก SQL ว่า “ถัดไป” วัดจากลำดับไหน
ตัวอย่างการใช้งานจริง
สมมติเรามีตารางยอดขายรายวัน DailySales ดังนี้
| SaleDate | Amount |
| 2024-01-01 | 1000 |
| 2024-01-02 | 1200 |
| 2024-01-03 | 1100 |
โจทย์: ต้องการดูยอดขายของ “วันพรุ่งนี้” มาเทียบกับ “วันนี้”
SELECT SaleDate, Amount AS TodaySales, LEAD (Amount, 1, 0) OVER (ORDER BY SaleDate) AS TomorrowSales
FROM DailySales;
ผลลัพธ์ที่ได้
| SaleDate | TodaySales | TomorrowSales |
| :--- | :--- | :--- |
| 2024-01-01 | 1000 | 1200 |
| 2024-01-02 | 1200 | 1100 |
| 2024-01-03 | 1100 | 0 |
การใช้ PARTITION BY
หากคุณมีข้อมูลหลายสาขา หรือหลายสินค้า และต้องการใช้ LEAD แยกตามกลุ่มนั้น ๆ ให้ใช้ PARTITION BY
SELECT StoreID, SaleDate, Amount, LEAD (Amount) OVER (PARTITION BY StoreID ORDER BY SaleDate) AS NextSaleAmount
FROM Sales;
Note: การใช้ Partition จะทำให้ฟังก์ชัน LEAD รีเซ็ตใหม่ทุกครั้งที่เปลี่ยนกลุ่มข้อมูล
ข้อดีของการใช้ LEAD
- Performance: ทำงานได้เร็วกว่าการทำ Self-join ในกรณีที่ตารางมีขนาดใหญ่
- Readability: Code อ่านง่ายและสั้นลงมาก
- Flexibility: สามารถกำหนดค่า Default ได้เอง ทำให้ไม่ต้องมาเขียน
ISNULLครอบอีกชั้น
ข้อควรระวัง
- ORDER BY: ห้ามลืมเด็ดขาด เพราะถ้าลำดับข้อมูลผิด ค่าที่ดึงมาก็จะผิดความหมายทันที
- NULL handling: แถวสุดท้ายของชุดข้อมูลจะเป็น NULL เสมอ หากไม่ระบุค่า
defaultไว้ในฟังก์ชัน
การใช้ LEAD คู่กับฟังก์ชันคู่หูอย่าง LAG จะช่วยให้คุณทำ Report เชิงวิเคราะห์ได้เก่งขึ้นมากครับ!
อ่านเพิ่มเติม