ROW_NUMBER() ฟังค์ชั่นใหม่ใน SQL Server 2005

(post นี้เอามาจากที่เคย post ไว้ที่ bloggang เมื่อนานมาแล้ว แต่ตอนนี้จะย้ายนิวาสมาอยู่ wordpress แล้ว)
สมหวังกันแล้วครับคราวนี้ ในที่สุด sql server ก็มีฟังค์ชั่น row_number() ไว้สำหรับบอกหมายเลขบรรทัดของการ query
ทีนี้เราก็จะสามารถทำ paging ให้กับ query ได้ซะที ว่าที่จริงมันก็ไม่ใช่เรื่องใหม่อะไร MySql เค้าทำ limit ได้มาตั้งนานแล้ว
Oracle ก็มี RowId ให้ใช้มานานแล้วเหมือนกัน

มาดูหน้าตาของ sql ที่ใช้ row_number() ในการทำ pagable query เลยดีกว่าครับ

select * from
(
select person.*, (row_number() over (order by person_id desc) - 1 ) / pagesize as page_no
from person
where .........
)
where page_no = 0

โดยหลักการก็คือ query หลักของเรา ได้เพิ่ม row_number ฟังค์ชั่นเข้าไป
เพื่อให้ทราบ “หมายเลขบรรทัด” ของผลการ query ซึ่งเราต้องบอกด้วยว่า
หมายเลขบรรทัดที่ว่านี้ให้เรียงลำดับด้วยอะไร โดยใช้คำสั่ง over (order by … ) นั่นเอง
ในที่นี้พอได้หมายเลขบรรทัดมาผมก็เอามา div ด้วย pagesize
pagesize ตรงนี้เป็นตัวแปรที่เรากำหนดเองครับ แล้วแต่ว่าจะให้มีกี่บรรทัด per page
พอได้แล้ว ก็ให้ query ซ้อนซะเข้าไปอีกที แล้วกำหนดเงื่อนไขว่า จากการ select ข้างต้น
เอาแค่ผลลัพธ์ใน page ที่กำหนด เท่านี้เราก็สามารถ query เป็นหน้าๆ ได้
ไม่ต้องโหลดข้อมูลคราวละมากๆ อีกแล้วครับ

สุดท้ายนี้โน้ตไว้นิดนึงว่า ฟังค์ชั่นนี้ สามารถใช้งานได้ทั้งใน sql server ธรรมดา
และ sql server express ครับ แต่ไม่มีใน sql compact edition😦

Update Oct 2013
ผมเขียนอีกบทความนึงไว้ ซึ่งมีรายละเอียดเกี่ยวกับ ROW_NUMBER มากขึ้นครับ ตามไปดูได้ใน วิธีเขียน Query เพื่อ Select Top N ของ Group

2 Responses to “ROW_NUMBER() ฟังค์ชั่นใหม่ใน SQL Server 2005”

  1. ทำ Paging ง่ายๆ กับ Linq to SQL « Panya's Blog: A Practical Guide for .NET Developer Says:

    […] khunpanya คราวก่อนผมได้พูดถึงฟังค์ชั่น ROW_NUMBER ของ SQL Server 2005 ซึ่งเป็นตัวสำคัญในการทำ paging […]

  2. ALTELMA Says:

    สวัสดีครับ พี่ ปัญญา ขอบคุณสำหรับเนื้อหาในเรื่องของการใช้ ROW_NUMBER() ผมอยากจะสอบถามเพิ่มเติมในเรื่องรายละเอียดที่จะนำไปใช้ แบ่งหน้าตอนนี้ ยังตันอยู่เลยครับ พอดีว่า เป็นหน้าผลลัพธืที่ search มาแล้ว ช่วงของข้อมูลมันขาด เลยอยากได้ ความรู้เกี่ยวกับตัวอย่างการใช้ ฟังชันนี้เพิ่มเติมครับ


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: