0Pricing
SQL Academy · บทเรียน

Lag/Lead กับหน้าต่างกรอบ

ใช้ LAG/LEAD ร่วมกับหน้าต่างกรอบเพื่อคำนวณส่วนต่างระหว่างช่วงเวลาและตรวจจับช่องว่างในอนุกรมเวลา

Lag/Lead กับหน้าต่างกรอบ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

สรุป LAG/LEAD

LAG(col, n) ส่งคืนค่าที่อยู่ก่อนแถวปัจจุบัน n แถวในหน้าต่าง ส่วน LEAD(col, n) จะดูไปข้างหน้า

SELECT day, revenue,
       LAG(revenue) OVER (ORDER BY day) AS prev_day_revenue
FROM daily_revenue;

LAG พร้อมค่าเริ่มต้น

อาร์กิวเมนต์ที่สามคือค่าเริ่มต้นเมื่อไม่มีเพื่อนบ้าน:

LAG(revenue, 1, 0) OVER (ORDER BY day)
-- Returns 0 instead of NULL for the very first row.

การคำนวณความเปลี่ยนแปลง

การเปลี่ยนแปลงเมื่อเทียบกับวันก่อน:

SELECT day, revenue,
       revenue - LAG(revenue, 1, 0) OVER (ORDER BY day) AS delta
FROM daily_revenue;

LAG หลายขั้น

เปรียบเทียบกับ N วันที่แล้ว ซึ่งมีประโยชน์สำหรับการเปรียบเทียบสัปดาห์ต่อสัปดาห์และปีต่อปี:

LAG(revenue, 7) OVER (ORDER BY day)   -- 7 days ago
LAG(revenue, 365) OVER (ORDER BY day) -- 1 year ago

LEAD สำหรับช่วงเวลาที่ใช้คาดการณ์

รูปแบบ “เหตุการณ์ถัดไปคืออะไร”:

SELECT id, ts,
       LEAD(ts) OVER (PARTITION BY user_id ORDER BY ts) AS next_ts,
       LEAD(ts) OVER (PARTITION BY user_id ORDER BY ts) - ts AS gap_to_next
FROM events;

รูปแบบแยกตามผู้ใช้

LAG/LEAD จะเคารพ PARTITION BY:

SELECT user_id, ts, action,
       LAG(action) OVER (PARTITION BY user_id ORDER BY ts) AS prev_action
FROM events;
-- prev_action is the user's previous event, not globally.

การตรวจจับการเปลี่ยนสถานะ

รวม LAG กับ CASE:

SELECT id, status,
  CASE WHEN status <> LAG(status) OVER (ORDER BY ts) THEN 'changed' ELSE 'same' END
FROM orders;

FIRST_VALUE / LAST_VALUE

ค่าแรกหรือค่าสุดท้ายภายในกรอบ:

FIRST_VALUE(status) OVER (PARTITION BY order_id ORDER BY ts) AS first_status
-- The status when the order was first seen.

LAST_VALUE(status) OVER (
  PARTITION BY order_id ORDER BY ts
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS final_status

NTH_VALUE

ค่าลำดับที่ N ของหน้าต่างที่เรียงลำดับแล้ว:

NTH_VALUE(revenue, 3) OVER (
  ORDER BY revenue DESC
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
-- Third-highest revenue value.

ฟังก์ชันกรอบแยกตามกลุ่ม

รวม LAG กับ PARTITION BY เพื่อหาเพื่อนบ้านแยกตามกลุ่ม:

SELECT user_id, ts, page,
       LAG(page) OVER (PARTITION BY user_id ORDER BY ts) AS prev_page,
       LEAD(page) OVER (PARTITION BY user_id ORDER BY ts) AS next_page
FROM page_views;

ประสิทธิภาพ

ฟังก์ชันหน้าต่างจะเรียงลำดับหนึ่งครั้งต่อพาร์ทิชัน เมื่อพาร์ทิชันมีขนาดใหญ่ ให้สร้างดัชนีคอลัมน์ (PARTITION BY, ORDER BY)

สรุปทบทวน

LAG/LEAD ช่วยให้การเปรียบเทียบระหว่างแถวทำได้อย่างมีประสิทธิภาพ

  • ค่าเริ่มต้นช่วยหลีกเลี่ยง NULL
  • ใช้ร่วมกับ CASE เพื่อตรวจจับการเปลี่ยนสถานะ
  • FIRST_VALUE/LAST_VALUE/NTH_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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “Lag/Lead กับหน้าต่างกรอบ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เงื่อนไขกรอบ: ROWS เทียบกับ RANGE
  2. Lag/Lead กับหน้าต่างกรอบ
  3. การแบ่งกลุ่มด้วย NTILE และ Cume_Dist
  4. รูปแบบการทำรายงานจากสถานการณ์จริง
← กลับไปที่ SQL Academy