ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่
คำนวณผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่ด้วย SUM(...) OVER (ORDER BY ... ROWS BETWEEN ...)
ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
พื้นฐานผลรวมสะสม
ผลรวมสะสมคือ SUM ที่มี ORDER BY ในหน้าต่าง และไม่มีส่วนกำหนดกรอบ ดังนั้นกรอบเริ่มต้นคือ "ตั้งแต่ต้นจนถึงแถวปัจจุบัน":
SELECT day, revenue,
SUM(revenue) OVER (ORDER BY day) AS running_total
FROM daily_revenue
ORDER BY day;ผลรวมสะสมต่อกลุ่ม
รีเซ็ตผลรวมสะสมแยกตามผู้ใช้:
SELECT id, user_id, total,
SUM(total) OVER (
PARTITION BY user_id ORDER BY created_at
) AS user_running_total
FROM orders;ค่าเฉลี่ยเคลื่อนที่
ค่าเฉลี่ยเคลื่อนที่ N วันใช้กรอบ ROWS:
SELECT day, revenue,
AVG(revenue) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS avg_7d
FROM daily_revenue;ค่าเฉลี่ยเคลื่อนที่แบบมีจุดศูนย์กลาง
หน้าต่าง 7 วันแบบมีจุดศูนย์กลาง (ก่อนหน้า 3 วัน แถวปัจจุบัน และถัดไป 3 วัน):
SELECT day, revenue,
AVG(revenue) OVER (
ORDER BY day
ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
) AS avg_7d_centred
FROM daily_revenue;การกระจายสะสม
ในแต่ละวัน เรามีรายได้รวมสะสมถึงสัดส่วนเท่าใดของรายได้ทั้งหมด
SELECT day, revenue,
SUM(revenue) OVER (ORDER BY day)
/ SUM(revenue) OVER () AS cum_share
FROM daily_revenue;ROWS เทียบกับ RANGE
ROWS— นับแถวตามตำแหน่งจริง (N แถวก่อนหน้าหรือถัดไป)RANGE— ครอบคลุมค่าตามตรรกะ (เช่น 7 วันโดยอิงจากค่าวันที่)
-- ROWS: 6 previous rows + this one (may skip dates with no data)
AVG(revenue) OVER (ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
-- RANGE: include any row with a day within '6 days' of the current row
AVG(revenue) OVER (ORDER BY day RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW)ค่าสูงสุดสะสม
ค่าที่ดีที่สุดจนถึงแต่ละจุด:
SELECT day, total_users,
MAX(total_users) OVER (ORDER BY day) AS peak_so_far
FROM daily_metrics;จำนวนสะสม
จำนวนเหตุการณ์ทั้งหมดที่พบจนถึงแถวนี้:
SELECT id, ts,
COUNT(*) OVER (ORDER BY ts) AS events_so_far
FROM events;การตรวจหาค่าผิดปกติ
เปรียบเทียบรายได้วันนี้กับค่าพื้นฐานแบบเคลื่อนที่:
SELECT day, revenue, avg_7d,
CASE WHEN revenue < 0.5 * avg_7d THEN 'WARNING' ELSE 'OK' END AS status
FROM (
SELECT day, revenue,
AVG(revenue) OVER (ORDER BY day ROWS BETWEEN 7 PRECEDING AND 1 PRECEDING) AS avg_7d
FROM daily_revenue
) sub;ค่า NULL ในช่วงเริ่มต้น
เมื่อใช้หน้าต่าง 7 แถว 6 แถวแรกจะมีค่าเฉลี่ยเป็น NULL หรือเป็นค่าเฉลี่ยจากข้อมูลบางส่วน ให้ตัดสินใจว่าจะซ่อนค่าเหล่านี้ หรือถือว่าหน้าต่างบางส่วนเป็นข้อมูลที่ใช้ได้
ประสิทธิภาพ
การรวมแบบสะสมต้องใช้ข้อมูลที่จัดเรียงตามกลุ่มย่อยแล้ว ดัชนีบนคอลัมน์ ORDER BY จะช่วยหลีกเลี่ยงการจัดเรียง
สรุป
กรอบช่วยให้ใช้การคำนวณสะสมได้
- กรอบเริ่มต้นเมื่อมี ORDER BY = "ตั้งแต่ต้นจนถึงแถวปัจจุบัน"
ROWS BETWEEN n PRECEDING AND CURRENT ROW= หน้าต่างแบบเคลื่อนที่- SUM/AVG/MAX บนหน้าต่าง = ค่าสะสมหรือค่าเคลื่อนที่
ตรวจสอบความเข้าใจ
ส่วนกำหนดกรอบใดให้ค่าเฉลี่ยเคลื่อนที่ 7 วันจนถึงแถวปัจจุบัน
คำถามที่พบบ่อย
บทเรียน “ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่”
คำนวณผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่ด้วย SUM(...) OVER (ORDER BY ... ROWS BETWEEN ...) คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- OVER, PARTITION BY, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD และรูปแบบอนุกรมเวลา
- ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่