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

ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่

คำนวณผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่ด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. OVER, PARTITION BY, ORDER BY
  2. ROW_NUMBER, RANK, DENSE_RANK
  3. LAG, LEAD และรูปแบบอนุกรมเวลา
  4. ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่
← กลับไปที่ SQL Academy