程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 實例講解sql server排名函數DENSE_RANK的用法

實例講解sql server排名函數DENSE_RANK的用法

編輯:關於SqlServer

一、需求

  之前sql server 的排名函數用得最多的應該是RoW_NUMBER()了,我通常用ROW_NUMBER() + CTE 來實現分頁;今天逛園,看到另一個內置排名函數還不錯,自己順便想了一個需求,大家可以花1分鐘先想想要怎麼實現。

  需求很簡單:求成績排名前五的學生信息。

  例如:

  

  由於成績可以並列,所以前五名可能有多個。例如:

    

  測試數據:  

declare @t table
(ID int,
 StudentName nvarchar(15),
 Score int)
 
insert into @t
select 1,'黃一',99 union all
select 2,'吳二',99 union all
select 3,'張三',99 union all
select 4,'李四',98 union all
select 5,'王五',97 union all
select 6,'趙六',96 union all
select 7,'田七',95 union all
select 8,'紀八',94 union all
select 9,'邱九',93 union all
select 10,'林十',92 

二、自己實現

  我的想法:既然可能出現並列,那麼就用 DISTINCT 找到前五的成績。ok,代碼如下:

select t1.* from @t t1
join(select distinct top 5 Score from @t order by Score desc) t2
on t1.Score = t2.Score    

  看起來和上面的要求的結果還是不太一樣,少了排序,當然我們可以在程序處理,這不是問題。

三、使用內置排名函數 DENSE_RANK

  其實sql server已經內置了這樣的函數可以幫助我們輕松實現,ok,直接上代碼:

;with cte as(
  select dense_rank() over(order by Score desc) rank,* from @t
)
select * from cte where rank < 6   

 四、擴展,內置排名函數RANK

  與 DENSE_RANK類似還有一個RANK函數,不過RANK函數不會順序排名,而是根據序號排。有點繞,把上面的函數改為RANK()就知道了,得到的結果如下:

  

以上就是sql server排名函數DENSE_RANK的使用方法,分享了自己的一些想法,希望對大家的學習有所啟發。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved