2009年9月16日 星期三

MS SQL - 排序函數:ROW_NUMBER()、RANK() 與 DENSE_RANK()

這三個排序函數是MS SQL 2005之後的版本才有的,雖然公司寫的是PHP,但還是會遇到客戶使用MS SQL
然而最近遇到了排序會亂掉的問題,所以就上網搜尋了一下資料,於是在【旗標知識網】查到了一些很有用的資料,特別在此紀錄一下,希望【旗標】的大大不要生氣^^"

針對資料表的欄位進行排序
ROW_NUMBER() 可以依照指定的欄位將所有記錄進行排序, 然後再依照順利為每一筆記錄給 定一個序號,但如果指定的欄位資料一樣時,會依照其他依據來決定排名,因此名次不會相同。 以下是借用原文章的SQL語法 而 RANK()函數遇到相同的數值會給相同的排名, 其後的排名則會跳過。例如有三個第 2 名 時, 就不會有第 3 及第 4 名, 它會從第 5 名開始。RANK() 的用法與 ROW_UNMBER() 是類似的。 如果排名不想被自動跳過的話可以使用DENSE_RANK()函數。 指定查詢範圍
排序函數除了可以將所有記錄進行排序, 還能夠指定查詢第 M 筆到第 N 筆的記錄。我之前曾經寫過SQL 2000版本的語法,這裡我RANK()來撰寫,由於原文的例子似乎不是程式的語法,所以在這改用自己公司寫的例子來給大家看看 上面這個例子各位要注意一下inner join的位置,如果你是擺在最內層join的話,是沒問題的,但如果你像我一樣是擺在最外層才join,最後排出來的順序會亂跳,所以必須在最後加上order by 的語法將取得的資料排程你所需要的順序

沒有留言: