ฟังก์ชัน SQL lag() ช่วยให้คุณเข้าถึงแถวก่อนหน้าจากแถวปัจจุบันที่ออฟเซ็ตเฉพาะ กล่าวโดยสรุป ฟังก์ชัน lag() ช่วยให้คุณเข้าถึงแถวก่อนหน้าจากแถวปัจจุบันได้ ด้วยการระบุค่าออฟเซ็ต คุณสามารถเข้าถึงแถว 1, 2, 3 ฯลฯ ก่อนหน้าจากแถวปัจจุบันได้
มันอยู่ตรงข้ามกับฟังก์ชัน lead() ซึ่งช่วยให้คุณเข้าถึงแถวถัดไปได้
ความล่าช้าของ SQL()
ไวยากรณ์ของฟังก์ชันมีดังนี้:
LAG(value_expression, ออฟเซ็ต [, ค่าเริ่มต้น])
เกิน (
[แบ่งตาม partition_expression]
เรียงลำดับตาม sort_expression [ASC | รายละเอียด]
);
ต่อไปนี้เป็นข้อโต้แย้งที่ได้รับการสนับสนุน:
- ค่า_การแสดงออก – ระบุค่าตอบแทนของแถวก่อนหน้า นิพจน์ต้องประเมินเป็นค่าเดียว
- ชดเชย – ระบุจำนวนแถวย้อนหลังจากแถวปัจจุบันที่จะเข้าถึง
- ค่าเริ่มต้น – จะตั้งค่าเริ่มต้นหากออฟเซ็ตอยู่นอกขอบเขตของพาร์ติชัน ตามค่าเริ่มต้น ค่าจะถูกตั้งเป็น NULL
- แบ่งพาร์ติชั่นโดย – ระบุวิธีการแบ่งพาร์ติชันข้อมูล
- สั่งโดย – กำหนดรูปแบบลำดับสำหรับแถวในแต่ละพาร์ติชัน
การตั้งค่าข้อมูลตัวอย่าง
ก่อนที่เราจะเจาะลึกการทำงานของฟังก์ชัน lag() ให้เราเริ่มต้นด้วยการตั้งค่าตารางพื้นฐานเพื่อวัตถุประสงค์ในการสาธิต
สร้างผลิตภัณฑ์ตาราง (
product_id INT คีย์หลัก AUTO_INCREMENT,
ชื่อผลิตภัณฑ์ VARCHAR(255)
หมวดหมู่ VARCHAR (255)
ราคา ทศนิยม(10, 2),
ปริมาณ INT,
expiration_date วันที่,
บาร์โค้ด BIGINT
);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่า ('หมวกเชฟ 25 ซม.',
'เบเกอรี่',
24.67,
57,
'2023-09-09',
2854509564204);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่านิยม ('ไข่นกกระทา - กระป๋อง',
'ตู้กับข้าว',
17.99 น.
67,
'2023-09-29',
1708039594250);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่านิยม ('กาแฟ - Egg Nog Capuccino',
'เบเกอรี่',
92.53,
10,
'2023-09-22',
8704051853058);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่านิยม ('ลูกแพร์ - เต็มไปด้วยหนาม',
'เบเกอรี่',
65.29,
48,
'23-08-2023',
5174927442238);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่านิยม ('พาสต้า - ผมนางฟ้า',
'ตู้กับข้าว',
48.38,
59,
'2023-08-05',
8008123704782);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่านิยม ('ไวน์ - Prosecco Valdobiaddene',
'ผลิต',
44.18,
3,
'2023-03-13',
6470981735653);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่า ('ขนมอบ - เฟรนช์มินิคละ',
'ตู้กับข้าว',
36.73,
52,
'2023-05-29',
5963886298051);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่านิยม ('ส้ม - กระป๋อง, จีนกลาง',
'ผลิต',
65.0,
1,
'2023-04-20',
6131761721332);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่านิยม ('หมู-ไหล่',
'ผลิต',
55.55,
73,
'2023-05-01',
9343592107125);
แทรก
เข้าไปข้างใน
ผลิตภัณฑ์ (ชื่อผลิตภัณฑ์,
หมวดหมู่,
ราคา,
ปริมาณ,
วันหมดอายุ,
บาร์โค้ด)
ค่านิยม ('Dc Hikiage Hira Huba',
'ผลิต',
56.29,
53,
'2023-04-14',
3354910667072);
เมื่อการสร้างและตั้งค่าข้อมูลเสร็จสมบูรณ์แล้ว เราจะมาพูดถึงตัวอย่างบางส่วนกันต่อ
ตัวอย่างที่ 1: การใช้งานพื้นฐาน
ในกรณีนี้ เรามีสิทธิ์เข้าถึงตาราง 'ผลิตภัณฑ์' ที่มีข้อมูลผลิตภัณฑ์ สมมติว่าเราต้องการรับบาร์โค้ดก่อนหน้าจากแถวปัจจุบัน
เราสามารถใช้ฟังก์ชัน lag() ได้ดังนี้:
เลือกชื่อผลิตภัณฑ์,
ราคา,
lag(บาร์โค้ด) เกิน (แบ่งพาร์ติชันตามหมวดหมู่
สั่งโดย
ราคา asc) เป็น Previous_item
จาก
ผลิตภัณฑ์พี;
รหัสที่กำหนดแบ่งพาร์ติชันข้อมูลตามหมวดหมู่ จากนั้นจะดึงบาร์โค้ดก่อนหน้าในพาร์ติชันโดยใช้ฟังก์ชัน lag()
ผลลัพธ์ที่ได้จะเป็นดังนี้:
ตัวอย่างที่ 2: การตั้งค่าเริ่มต้น
หากไม่มีแถวก่อนหน้าในคอลัมน์ใดคอลัมน์หนึ่ง (ไม่อยู่ในขอบเขต) ฟังก์ชันจะตั้งค่าเป็น NULL ดังที่แสดงในตัวอย่างก่อนหน้านี้
หากต้องการตั้งค่าเริ่มต้นสำหรับการเข้าถึงนอกขอบเขต เราสามารถดำเนินการดังต่อไปนี้:
เลือกชื่อผลิตภัณฑ์,
ราคา,
lag(บาร์โค้ด, 1, 'N/A') เกิน (แบ่งพาร์ติชันตามหมวดหมู่
สั่งโดย
ราคา asc) เป็น Previous_item
จาก
ผลิตภัณฑ์พี;
เราตั้งค่าเริ่มต้นเป็น 'N/A' สิ่งนี้ควรแทนที่ค่านอกขอบเขตตามที่แสดงในเอาต์พุต:
ตัวอย่างที่ 3: ค่าออฟเซ็ตแบบกำหนดเอง
สมมติว่าคุณต้องการเข้าถึงสองแถวก่อนหน้าจากแถวปัจจุบัน เราสามารถทำได้โดยตั้งค่าออฟเซ็ตเป็น 2
แบบสอบถามตัวอย่างจะแสดงดังต่อไปนี้:
เลือกชื่อผลิตภัณฑ์,
ราคา,
lag(บาร์โค้ด, 2, 'N/A') เกิน (แบ่งพาร์ติชันตามหมวดหมู่
สั่งโดย
ราคา asc) เป็น Previous_item
จาก
ผลิตภัณฑ์พี;
เอาท์พุท:
แบบสอบถามนี้ส่งคืนสองแถวก่อนหน้าในแต่ละพาร์ติชัน
บทสรุป
ในบทช่วยสอนนี้ เราได้เรียนรู้วิธีทำงานกับฟังก์ชัน lag() เพื่อรับรายการก่อนหน้าจากแถวปัจจุบัน