2012年3月4日 星期日

序號(ROW_NUMBER,RANK,OVER)

請參考來源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

沒有留言:

張貼留言