分組取TOP數據是T-SQL中的經常使用查詢, 如學生信息管理系統中取出每一個學科前3名的學生。這種查詢在SQL Server 2005以前,寫起來很繁瑣,須要用到臨時表關聯查詢才能取到。SQL Server 2005後以後,引入了row_number()函數,row_number()函數的分組排序功能使這種操做變得很是簡單。下面是一個簡單示例:sql
--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排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的惟一的)測試