ROW_NUMBER()、RANK() 與 DENSE_RANK()
呃… 說真的,我都不常用到
要不是這次寫的網頁要做到"分頁",也許我也不會來寫這一篇吧!
一開始只是想說… gridview不是就有支援分頁的功能嗎? 幹嘛自己寫呀!
但是~ user說 gridview 的分頁都在不起眼的地方
他們希望可以做成 gridview 和按鈕: [第一頁][上一頁][下一頁][最末頁] 是分開的
所以… 只好自己做囉!
■ 針對資料表的欄位進行排序
※ ROW_NUMBER() :可以依照指定的欄位將所有記錄進行排序
然後再依照順利為每一筆記錄給定一個序號
但如果指定的欄位資料一樣時,會依照其他依據來決定排名,因此名次不會相同。
以下是借用原文章的SQL語法:
SELECT 書籍編號, 書籍名稱, 價格, 出版公司,
ROW_NUMBER() OVER(ORDER BY 價格) AS 價格排名
FROM 書籍
※ RANK():遇到相同的數值會給相同的排名,其後的排名則會跳過
例如有三個第 2 名時, 就不會有第 3 及第 4 名, 它會從第 5 名開始
RANK() 的用法與 ROW_UNMBER() 是類似的。
語法如下:
SELECT 書籍編號, 書籍名稱, 價格, 出版公司,
RANK() OVER(ORDER BY 價格) AS 價格排名
FROM 書籍
※ DENSE_RANK():如果排名不想被自動跳過的話可以使用這個函數。
語法如下:
SELECT 書籍編號, 書籍名稱, 價格, 出版公司,
DENSE_RANK() OVER(ORDER BY 價格) AS 價格排名
FROM 書籍
■ 指定查詢範圍
排序函數除了可以將所有記錄進行排序, 還能夠指定查詢第 M 筆到第 N 筆的記錄。
語法如下:
SELECT RANK() OVER (ORDER BY 價格) AS 價格排名, * FROM
(
)AS DT1
上面這個例子各位要注意一下inner join的位置,如果你是擺在最內層join的話,是沒問題的,
但如果你像我一樣是擺在最外層才join,最後排出來的順序會亂跳,
所以必須在最後加上order by 的語法將取得的資料排程你所需要的順序
--
資料來源:
旗標知識網:http://www.flag.com.tw/book/cento-5105.asp?bokno=F6221&id=119
ICE NoteBook:http://ice-note.blogspot.com/2009/09/ms-sql-rownumberrank-denserank.html