SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单
分组取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排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
转自:
http://www.jb51.net/article/29162.htm
参考:
http://msdn.microsoft.com/zh-cn/library/ms186734.aspx
http://www.cnblogs.com/85538649/archive/2011/08/13/2137277.html

