請參考來源1
請參考來源2
--
※ 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 * FROM
(
SELECT RANK() OVER (ORDER BY 價格) AS 價格排名, * FROM
(
SELECT * FROM 書籍
)AS DT1
)AS DT2
WHERE 價格排名 BETWEEN (第 M 筆) AND (第 N 筆)
===== ICE NoteBook ======
SELECT t2.*, b.title as sfm_title FROM
(
SELECT rank() OVER (ORDER BY t1.id DESC) AS RankNumber, * FROM
(
select * from focus_detail where delete='F'
) AS t1
)AS t2 inner join focus_master b on b.id=t2.sfm_id
WHERE RankNumber between 11 and 20
上面這個例子各位要注意一下inner join的位置,如果你是擺在最內層join的話,是沒問題的,
但如果你像我一樣是擺在最外層才join,最後排出來的順序會亂跳,
所以必須在最後加上order by 的語法將取得的資料排程你所需要的順序
SELECT t2.*, b.title as sfm_title FROM
(
SELECT rank() OVER ( ORDER BY t1.id DESC ) AS RankNumber, * FROM
(
select * from focus_detail where delete='F'
) AS t1
)AS t2 inner join focus_master b on b.id=t2.sfm_id
WHERE RankNumber between 11 and 20 ORDER BY t1.id DESC
沒有留言:
張貼留言