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 * FROM
            (
                SELECT RANK() OVER (ORDER BY 價格) AS 價格排名, * FROM
                (
                    SELECT * FROM 書籍
                )AS DT1
            )AS DT2
            WHERE 價格排名 BETWEEN (第 M 筆) AND (第 N 筆)
         
         
         
        ===== ICE NoteBook ======
         
         
      1. SELECT t2.*, b.title as sfm_title FROM   
      2. (   
      3.     SELECT rank() OVER (ORDER BY t1.id DESC) AS RankNumber, * FROM   
      4.     (   
      5.          select * from focus_detail where delete='F'  
      6.     ) AS t1   
      7. )AS t2 inner join focus_master b on b.id=t2.sfm_id    
      8. WHERE RankNumber between 11 and 20  
      9.  上面這個例子各位要注意一下inner join的位置,如果你是擺在最內層join的話,是沒問題的,

        但如果你像我一樣是擺在最外層才join,最後排出來的順序會亂跳,

        所以必須在最後加上order by 的語法將取得的資料排程你所需要的順序

         

      10. SELECT t2.*, b.title as sfm_title FROM   
      11. (   
      12.     SELECT rank() OVER ( ORDER BY t1.id DESC ) AS RankNumber, * FROM   
      13.     (   
      14.          select * from focus_detail where delete='F'  
      15.     ) AS t1   
      16. )AS t2 inner join focus_master b on b.id=t2.sfm_id    
      17. WHERE RankNumber between 11 and 20  ORDER BY t1.id DESC 
      18.  

        --

        資料來源:

        旗標知識網: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

         

         

        arrow
        arrow
          全站熱搜

          ⒶⓂⓎ 發表在 痞客邦 留言(0) 人氣()