LAG, LEAD และรูปแบบอนุกรมเวลา
เปรียบเทียบแต่ละแถวกับแถวก่อนหน้าหรือถัดไปด้วย LAG และ LEAD และสร้างค่าการเปลี่ยนแปลงระหว่างช่วงเวลา
LAG, LEAD และรูปแบบอนุกรมเวลา เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
LAG และ LEAD: ย้อนกลับและไปข้างหน้า
ฟังก์ชันเหล่านี้ใช้เข้าถึงแถวข้างเคียงในหน้าต่าง:
LAG(col, n, default)— ค่าที่อยู่ก่อนแถวปัจจุบัน n แถวLEAD(col, n, default)— ค่าที่อยู่หลังแถวปัจจุบัน n แถว
แถวก่อนหน้า
เปรียบเทียบแต่ละคำสั่งซื้อกับคำสั่งซื้อก่อนหน้าของผู้ใช้คนเดียวกัน:
SELECT id, user_id, created_at, total,
LAG(total) OVER (
PARTITION BY user_id ORDER BY created_at
) AS prev_total
FROM orders;การเปลี่ยนแปลงรายวัน
ความแตกต่างจากวันก่อนหน้า:
SELECT day, revenue,
revenue - LAG(revenue) OVER (ORDER BY day) AS delta
FROM daily_revenue
ORDER BY day;การเปลี่ยนแปลงรายปี
ใช้ LAG โดยเลื่อนตำแหน่ง 12 แถวในลำดับรายเดือน:
SELECT month, revenue,
LAG(revenue, 12) OVER (ORDER BY month) AS prev_year_revenue,
revenue / NULLIF(LAG(revenue, 12) OVER (ORDER BY month), 0) - 1 AS yoy
FROM monthly_revenue;การตรวจหาช่วงข้อมูลที่หายไป
ค้นหาวันที่ไม่มีข้อมูล:
WITH d AS (
SELECT day, LAG(day) OVER (ORDER BY day) AS prev_day FROM daily_signups
)
SELECT day, prev_day, day - prev_day AS gap_days
FROM d
WHERE day - prev_day > 1;การจัดกลุ่มเป็นช่วงการใช้งาน
จัดกลุ่มแถวเป็นช่วงการใช้งานเมื่อช่วงว่างมีค่ามากกว่าเกณฑ์ที่กำหนด:
WITH gaps AS (
SELECT user_id, ts,
CASE WHEN ts - LAG(ts) OVER (PARTITION BY user_id ORDER BY ts)
> INTERVAL '30 min'
THEN 1 ELSE 0 END AS new_session
FROM events
)
SELECT user_id, ts,
SUM(new_session) OVER (PARTITION BY user_id ORDER BY ts) AS session_id
FROM gaps;รายการแรกและรายการสุดท้ายในกลุ่ม
FIRST_VALUE และ LAST_VALUE ใช้ดึงขอบเขตของหน้าต่าง:
SELECT id, total,
FIRST_VALUE(total) OVER (PARTITION BY user_id ORDER BY created_at) AS first_order,
LAST_VALUE(total) OVER (PARTITION BY user_id ORDER BY created_at
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_order
FROM orders;
-- LAST_VALUE needs the explicit frame, otherwise default frame ends at current row.NTH_VALUE
เลือกค่าลำดับที่ N ในกลุ่มย่อย:
SELECT id,
NTH_VALUE(total, 2) OVER (
PARTITION BY user_id ORDER BY total DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS second_largest
FROM orders;ค่าเริ่มต้นสำหรับอนุกรมเวลา
อาร์กิวเมนต์ที่สามของ LAG คือค่าเริ่มต้นเมื่อไม่มีแถวก่อนหน้า:
SELECT day, revenue,
revenue - LAG(revenue, 1, 0) OVER (ORDER BY day) AS delta
FROM daily_revenue;
-- delta on first day = revenue itself (vs NULL)การ JOIN ตารางกับตัวเองที่เทียบเท่า
คุณสามารถเขียน LAG เป็นการ JOIN ตารางกับตัวเองได้ แต่จะช้ากว่าและอ่านยากกว่า ควรเลือกใช้ฟังก์ชันหน้าต่างเสมอ
ประสิทธิภาพ
ฟังก์ชันหน้าต่างไล่ผ่านกลุ่มย่อยหนึ่งครั้ง คอขวดคือการจัดเรียง จึงควรจัดทำดัชนีให้คอลัมน์ใน ORDER BY เมื่อทำได้
สรุป
LAG และ LEAD ช่วยให้เปรียบเทียบแถวต่อแถวได้
- แถวก่อนหน้าและถัดไปภายในกลุ่มย่อย
- การเปลี่ยนแปลง การเปรียบเทียบระหว่างช่วงเวลา และการแบ่งเป็นช่วงการใช้งาน
- FIRST_VALUE/LAST_VALUE สำหรับขอบเขต
ตรวจสอบความเข้าใจ
คุณต้องการคำนวณการเปลี่ยนแปลงรายได้แบบวันต่อวัน ควรใช้ฟังก์ชันหน้าต่างใด
คำถามที่พบบ่อย
บทเรียน “LAG, LEAD และรูปแบบอนุกรมเวลา” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “LAG, LEAD และรูปแบบอนุกรมเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “LAG, LEAD และรูปแบบอนุกรมเวลา”
เปรียบเทียบแต่ละแถวกับแถวก่อนหน้าหรือถัดไปด้วย LAG และ LEAD และสร้างค่าการเปลี่ยนแปลงระหว่างช่วงเวลา คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “LAG, LEAD และรูปแบบอนุกรมเวลา” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- OVER, PARTITION BY, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD และรูปแบบอนุกรมเวลา
- ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่