การคำนวณค่าเฉลี่ยเคลื่อนที่
แทนที่จะดูผลรวมสะสมตั้งแต่ต้นจนถึงปัจจุบัน ฝ่ายบริหารต้องการเห็นค่าเฉลี่ยจำนวนเหตุการณ์ในช่วง 7 วันที่ผ่านมา กล่าวคือ เริ่มตั้งแต่ 6 วันก่อนหน้าจนถึงวันปัจจุบัน เนื่องจากการคำนวณนี้อ้างอิงกรอบเวลาที่กำหนดและเปลี่ยนแปลงไปตามคิวรี จึงเรียกว่าค่าเฉลี่ยเคลื่อนที่ (moving average)
SQL Server ไม่รองรับการกำหนดช่วงเวลาใน window function โดยตรง ดังนั้นจะสมมติว่ามีข้อมูลหนึ่งแถวต่อหนึ่งวัน และใช้ clause ROWS แทน
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การวิเคราะห์อนุกรมเวลาใน SQL Server
คำแนะนำการฝึกหัด
- เลือก window function ที่ถูกต้องเพื่อคำนวณค่าเฉลี่ยเคลื่อนที่ตั้งแต่ 6 วันก่อนหน้าจนถึงวันปัจจุบัน (แถวปัจจุบัน)
- กำหนดกรอบของ window โดยระบุ clause
ROWS, จำนวนแถวก่อนหน้า (window frame preceding) และแถวถัดไป (window frame following) ให้ครบถ้วน
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
SELECT
ir.IncidentDate,
ir.IncidentTypeID,
ir.NumberOfIncidents,
-- Fill in the correct window function
___(ir.NumberOfIncidents) OVER (
PARTITION BY ir.IncidentTypeID
ORDER BY ir.IncidentDate
-- Fill in the three parts of the window frame
___ BETWEEN ___ AND ___
) AS MeanNumberOfIncidents
FROM dbo.IncidentRollup ir
INNER JOIN dbo.Calendar c
ON ir.IncidentDate = c.Date
WHERE
c.CalendarYear = 2019
AND c.CalendarMonth IN (7, 8)
AND ir.IncidentTypeID = 1
ORDER BY
ir.IncidentTypeID,
ir.IncidentDate;