巧用row_number和partition by分組取top數據

      分組取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排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的惟一的)測試

相關文章
相關標籤/搜索