Company insights

การใช้งาน ROW_NUMBER() และ PARTITION BY ใน SQL Server


คำสั่ง ROW_NUMBER() ใน SQL Server ใช้สำหรับสร้างลำดับตัวเลขให้กับข้อมูลในแต่ละแถว
โดยสามารถกำหนดเงื่อนไขในการจัดกลุ่มข้อมูลได้ด้วยคำสั่ง PARTITION BY
ซึ่งจะทำให้การนับลำดับเริ่มต้นใหม่ในแต่ละกลุ่มของข้อมูล


คำสั่งนี้นิยมใช้ในงาน เช่น


  • การจัดลำดับข้อมูล

  • การดึงข้อมูลล่าสุดในแต่ละกลุ่ม

  • การลบข้อมูลซ้ำ (Duplicate Data)

  • การสร้างรายงานแบบลำดับในแต่ละหมวดหมู่

โครงสร้างคำสั่ง


ROW_NUMBER() OVER (
   PARTITION BY column_name
   ORDER BY column_name
)


คำอธิบาย


  • PARTITION BY ใช้แบ่งกลุ่มข้อมูล

  • ORDER BY ใช้กำหนดลำดับภายในกลุ่ม

  • ROW_NUMBER() จะสร้างเลขลำดับให้แต่ละแถว

ตัวอย่างตารางข้อมูล


sales
-----------------------------------
id | product | sale_date | amount
-----------------------------------
1  | A       | 2024-01-01 | 100
2  | A       | 2024-01-02 | 200
3  | A       | 2024-01-03 | 150
4  | B       | 2024-01-01 | 300
5  | B       | 2024-01-02 | 250

ตัวอย่างที่ 1: สร้างลำดับในแต่ละสินค้า


SELECT 
   product,
   sale_date,
   amount,
   ROW_NUMBER() OVER (
       PARTITION BY product
       ORDER BY sale_date
   ) AS row_num
FROM sales;


ผลลัพธ์


product | sale_date  | amount | row_num
----------------------------------------
A       | 2024-01-01 | 100    | 1
A       | 2024-01-02 | 200    | 2
A       | 2024-01-03 | 150    | 3
B       | 2024-01-01 | 300    | 1
B       | 2024-01-02 | 250    | 2


จะเห็นว่าเลขลำดับจะเริ่มใหม่เมื่อเปลี่ยนกลุ่มสินค้า

ตัวอย่างที่ 2: ดึงข้อมูลล่าสุดในแต่ละสินค้า


ตัวอย่างนี้ใช้ ROW_NUMBER เพื่อดึงข้อมูลรายการล่าสุดของแต่ละสินค้า


SELECT *
FROM (
   SELECT 
       product,
       sale_date,
       amount,
       ROW_NUMBER() OVER (
           PARTITION BY product
           ORDER BY sale_date DESC
       ) AS rn
   FROM sales
) t
WHERE rn = 1;


ผลลัพธ์จะเป็นข้อมูลล่าสุดของแต่ละสินค้า


product | sale_date  | amount
-------------------------------
A       | 2024-01-03 | 150
B       | 2024-01-02 | 250

ตัวอย่างที่ 3: ใช้ลบข้อมูลที่ซ้ำกัน


WITH cte AS (
   SELECT *,
   ROW_NUMBER() OVER (
       PARTITION BY product
       ORDER BY id
   ) AS rn
   FROM sales
)

DELETE FROM cte
WHERE rn > 1;


คำสั่งนี้จะลบข้อมูลที่ซ้ำ โดยเก็บไว้เฉพาะแถวแรกของแต่ละกลุ่ม

สรุป


ROW_NUMBER() ร่วมกับ PARTITION BY เป็นฟังก์ชันที่มีประโยชน์มากใน SQL Server
สำหรับการจัดลำดับข้อมูลภายในกลุ่ม ช่วยให้สามารถดึงข้อมูลล่าสุด
ลบข้อมูลซ้ำ หรือสร้างรายงานแบบจัดลำดับได้อย่างมีประสิทธิภาพ