คำสั่ง 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
สำหรับการจัดลำดับข้อมูลภายในกลุ่ม ช่วยให้สามารถดึงข้อมูลล่าสุด
ลบข้อมูลซ้ำ หรือสร้างรายงานแบบจัดลำดับได้อย่างมีประสิทธิภาพ
