ป้ายกำกับ: Running Total

การคำนวณสะสมด้วย Window Functions: ทำ ยอดรวมสะสม (Running Total) และ Moving Average ด้วย OVER()การคำนวณสะสมด้วย Window Functions: ทำ ยอดรวมสะสม (Running Total) และ Moving Average ด้วย OVER()

ในโลกของการวิเคราะห์ข้อมูลเชิงธุรกิจ (Business Intelligence) การดูเพียงแค่ค่ารวม ณ จุดใดจุดหนึ่งของข้อมูลนั้นไม่เพียงพอ เราจำเป็นต้องเข้าใจถึงแนวโน้ม (Trend) และภาพรวมสะสมที่เกิดขึ้นตลอดช่วงเวลา เพื่อให้สามารถตัดสินใจทางธุรกิจได้อย่างแม่นยำและรอบด้าน

หากคุณเคยใช้ SQL เพื่อหาผลรวมยอดขายรายเดือน แต่ต้องการทราบว่ายอดขายสะสมจนถึงเดือนปัจจุบันเป็นเท่าไหร่ หรือต้องการคำนวณค่าเฉลี่ยเคลื่อนที่ (Moving Average) เพื่อลดความผันผวนของข้อมูล นั่นคือจุดที่ Window Functions เข้ามามีบทบาทสำคัญ


Window Functions คืออะไร และทำงานอย่างไร?

Window Functions คือกลไกขั้นสูงใน SQL ที่ช่วยให้เราสามารถทำการคำนวณแบบกลุ่ม (Aggregate) เช่น SUM, AVG, COUNT, หรือ RANK โดยที่การคำนวณนั้นจะพิจารณาชุดข้อมูล (Window) ที่เกี่ยวข้องกับแถวปัจจุบัน โดยที่ยังคงรักษาข้อมูลรายละเอียดของแต่ละแถวไว้ ไม่มีการยุบแถวข้อมูล (GROUP BY) ออกไป

หัวใจสำคัญของฟังก์ชันนี้คือการใช้ Clause OVER() ซึ่งทำหน้าที่กำหนดขอบเขตและลำดับของการคำนวณให้ระบบทราบ โดยการกำหนด ORDER BY ภายใน OVER() จะเป็นการบังคับให้การคำนวณเป็นไปตามลำดับเวลาหรือลำดับที่กำหนด

การประยุกต์ใช้: Running Total และ Moving Average

เราจะใช้ตัวอย่างการคำนวณยอดขายรายวันในระบบ PostgreSQL เพื่อสาธิตการใช้งานทั้งสองฟังก์ชันนี้

1. Running Total (ยอดรวมสะสม)

Running Total คือการหาผลรวมที่เพิ่มขึ้นเรื่อยๆ ตามลำดับเวลา (Cumulative Sum) เราใช้ฟังก์ชัน SUM() ร่วมกับ OVER(ORDER BY...)

SQL

-- สมมติว่ามีตาราง sales (date, amount) อยู่แล้ว<pre>SELECT<br>    sale_date, <br>    daily_amount, <br>    SUM(daily_amount) OVER (ORDER BY sale_date ASC) AS running_total<br>FROM<br>    sales;<pre>

คำอธิบาย: คำสั่งนี้จะบอก PostgreSQL ว่าให้หาผลรวมของ daily_amount โดยเริ่มจากแถวแรกและคำนวณต่อไปเรื่อยๆ จนถึงแถวปัจจุบัน ทำให้ได้ยอดรวมสะสมที่ถูกต้อง

2. Moving Average (ค่าเฉลี่ยเคลื่อนที่)

Moving Average คือการคำนวณค่าเฉลี่ยของข้อมูลในช่วงเวลาที่กำหนด (เช่น 3 วันล่าสุด) ซึ่งช่วยให้เราเห็นแนวโน้มที่ราบเรียบขึ้น เราใช้ฟังก์ชัน AVG() และกำหนดขอบเขตของหน้าต่าง (Window Frame) ด้วย ROWS BETWEEN...

SQL

SELECT<br>    sale_date, <br>    daily_amount, <br>    AVG(daily_amount) OVER (ORDER BY sale_date ASC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average<br>FROM<br>    sales;<pre>

คำอธิบาย: ROWS BETWEEN 2 PRECEDING AND CURRENT ROW คือการกำหนดขอบเขตว่าในการคำนวณค่าเฉลี่ยสำหรับแถวปัจจุบัน ให้พิจารณาข้อมูลย้อนหลังไป 2 แถว (รวมแถวปัจจุบันเป็น 3 แถว) ซึ่งเป็นหลักการของค่าเฉลี่ยเคลื่อนที่ 3 วัน

สรุปและข้อควรจำสำหรับ Senior Architect

การใช้ Window Functions เป็นเครื่องมือที่ทรงพลังอย่างยิ่งในการวิเคราะห์ข้อมูลเชิงเวลา (Time Series Analysis) ใน PostgreSQL การเข้าใจความแตกต่างระหว่าง GROUP BY (ซึ่งยุบแถว) กับ OVER() (ซึ่งคงรายละเอียดแถว) คือกุญแจสำคัญในการเป็นนักวิเคราะห์ข้อมูลระดับสูง

เมื่อคุณต้องการคำนวณแนวโน้มสะสมหรือค่าเฉลี่ยที่ต้องพิจารณาจากบริบทของแถวอื่น ๆ ในชุดข้อมูลเดียวกัน การใช้ Window Functions คือคำตอบที่ถูกต้องและมีประสิทธิภาพที่สุด