[轉]SQL2005後的ROW_NUMBER()函數的應用

SQL Server 2005後以後,引入了row_number()函數,row_number()函數的分組排序功能使這種操做變得很是簡單html

分組取TOP數據是T-SQL中的經常使用查詢, 如學生信息管理系統中取出每一個學科前3名的學生。這種查詢在SQL Server 2005以前,寫起來很繁瑣,須要用到臨時表關聯查詢才能取到。SQL Server 2005後以後,引入了row_number()函數,row_number()函數的分組排序功能使這種操做變得很是簡單。下面是一個簡單示例:函數

--1.建立測試表 
create table #score 
( 
name varchar(20), 
subject varchar(20), 
score int 
) 
--2.插入測試數據 
insert into #score(name,subject,score) values('張三','語文',98) 
insert into #score(name,subject,score) values('張三','數學',80) 
insert into #score(name,subject,score) values('張三','英語',90) 
insert into #score(name,subject,score) values('李四','語文',88) 
insert into #score(name,subject,score) values('李四','數學',86) 
insert into #score(name,subject,score) values('李四','英語',88) 
insert into #score(name,subject,score) values('李明','語文',60) 
insert into #score(name,subject,score) values('李明','數學',86) 
insert into #score(name,subject,score) values('李明','英語',88) 
insert into #score(name,subject,score) values('林風','語文',74) 
insert into #score(name,subject,score) values('林風','數學',99) 
insert into #score(name,subject,score) values('林風','英語',59) 
insert into #score(name,subject,score) values('嚴明','英語',96) 
--3.取每一個學科的前3名數據 
select * from 
( 
select subject,name,score,ROW_NUMBER() over(PARTITION by subject order by score desc) as num from #score 
) T where T.num <= 3 order by subject 
--4.刪除臨時表 
truncate table #score 
drop table #score 

語法形式:ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)
解釋:根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的惟一的)測試

轉自:spa

http://www.jb51.net/article/29162.htm.net

參考:code

http://msdn.microsoft.com/zh-cn/library/ms186734.aspxhtm

http://www.cnblogs.com/85538649/archive/2011/08/13/2137277.htmlblog

相關文章
相關標籤/搜索