การใช้งาน PARTITION BY ใน SQL Server คือหัวใจสำคัญของการทำ Data Analytics เลยครับ มันช่วยให้เราสามารถคำนวณค่าทางสถิติหรือจัดลำดับข้อมูลภายใน “กลุ่ม” ที่เราต้องการ โดยที่ยังรักษาจำนวนแถว ของผลลัพธ์ไว้เท่าเดิม ไม่เหมือนกับการใช้ GROUP BY ที่จะยุบแถวรวมกัน
PARTITION BY vs GROUP BY
เพื่อให้เห็นภาพชัดเจน ลองดูความต่างพื้นฐานดังนี้ครับ
- GROUP BY: ใช้เพื่อยุบรวมข้อมูล เช่น หาผลรวมยอดขายแยกตามรายเดือน ผลลัพธ์ที่ได้จะมีจำนวนแถวเท่ากับจำนวนกลุ่ม
- PARTITION BY: ใช้ร่วมกับ Window Functions เพื่อคำนวณข้อมูลแยกตามกลุ่ม แต่ยังแสดงรายละเอียดของทุกแถวในตารางเดิมออกมาครบถ้วน
โครงสร้างคำสั่ง
เรามักจะเห็น PARTITION BY อยู่ใน OVER () clause เสมอ
<Window_Function> (column_name) OVER
ตัวอย่างการใช้งานที่พบบ่อย
การจัดลำดับด้วย ROW_NUMBER ()
สมมติว่าเรามีตารางยอดขาย และต้องการให้เลขลำดับ ของพนักงานแต่ละคนเริ่มนับ 1 ใหม่เสมอเมื่อเปลี่ยนชื่อพนักงาน
SELECT EmployeeName, SaleDate, Amount, ROW_NUMBER () OVER AS SaleRank
FROM Sales;
ในเคสนี้ หาก “นาย A” มี 3 รายการ และ “นาย B” มี 2 รายการ ลำดับจะรันเป็น 1, 2, 3 สำหรับนาย A แล้วกลับไปเริ่ม 1, 2 สำหรับนาย B
การหาผลรวมสะสม
เราสามารถหาได้ว่ายอดขายสะสมของแต่ละหมวดหมู่สินค้าเป็นอย่างไร
SELECT Category, ProductName, Price, SUM (Price) OVER AS CumulativeTotal
FROM Products;
ตารางเปรียบเทียบ Window Functions ยอดนิยม
| Function | หน้าที่ |
| ROW_NUMBER () | รันเลขลำดับ 1, 2, 3… ไปเรื่อย ๆ ในแต่ละกลุ่ม |
| RANK () | จัดลำดับแบบข้ามเลข หากมีค่าเท่ากัน |
| DENSE_RANK () | จัดลำดับแบบไม่ข้ามเลข |
| SUM/AVG/MIN/MAX | คำนวณค่าทางสถิติแยกตามกลุ่มในแต่ละแถว |
ข้อดีของการใช้ PARTITION BY
- รักษา Data Detail: ไม่ต้องเสียเวลาทำ Self-Join เพื่อเอาค่า Aggregate กลับมาแปะในตารางหลัก
- ประสิทธิภาพ: ในหลาย ๆ กรณี SQL Server Optimizer ทำงานกับ Window Functions ได้เร็วกว่าการเขียน Subquery ซ้อนกันหลายชั้น
- ความอ่านง่าย: Code ดูสะอาดและสื่อสารเจตนาชัดเจนว่ากำลังจัดการข้อมูลเป็นกลุ่ม ๆ
ข้อควรระวัง
การใช้ PARTITION BY บนตารางที่มีข้อมูลมหาศาล โดยไม่มี Index ที่เหมาะสมรองรับในคอลัมน์ที่สั่ง PARTITION หรือ ORDER BY อาจทำให้ Query ทำงานช้าลงเนื่องจากต้องใช้ทรัพยากรในการ Sorting ข้อมูลในหน่วยความจำครับ
อ่านเพิ่มเติม