SQL Server: PARTITION BY

การใช้งาน 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

  1. รักษา Data Detail: ไม่ต้องเสียเวลาทำ Self-Join เพื่อเอาค่า Aggregate กลับมาแปะในตารางหลัก
  2. ประสิทธิภาพ: ในหลาย ๆ กรณี SQL Server Optimizer ทำงานกับ Window Functions ได้เร็วกว่าการเขียน Subquery ซ้อนกันหลายชั้น
  3. ความอ่านง่าย: Code ดูสะอาดและสื่อสารเจตนาชัดเจนว่ากำลังจัดการข้อมูลเป็นกลุ่ม ๆ

ข้อควรระวัง

การใช้ PARTITION BY บนตารางที่มีข้อมูลมหาศาล โดยไม่มี Index ที่เหมาะสมรองรับในคอลัมน์ที่สั่ง PARTITION หรือ ORDER BY อาจทำให้ Query ทำงานช้าลงเนื่องจากต้องใช้ทรัพยากรในการ Sorting ข้อมูลในหน่วยความจำครับ


อ่านเพิ่มเติม

Exit mobile version