sqlserver巧用row_number和partition by分组取top数据
更新时间:2011年12月20日 11:55:07 作者:
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排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
复制代码 代码如下:
--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排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
相关文章
Sql Server 2005中查询用分隔符分割的内容中是否包含其中一个内容
Sql Server 2005中查询用分隔符分割的内容中是否包含其中一个内容,多个朋友给予的参考。2011-10-10SQL Server创建维护计划失败(SQL Server:14234 错误)的解决方法
这篇文章主要介绍了SQL Server创建维护计划失败(SQL Server:14234 错误)的解决方法,最后使用SQLServer2005 安装向导解决问题,需要的朋友可以参考下2014-08-08sqlserver2005 安装图解教程以及SQL 2005 SP3补丁安装图文教程
最近整理一些sql2005的安装教程,好多朋友慢慢开始使用sql2005,进行开发了,尝试新事物。2009-08-08SQL Server CROSS APPLY和OUTER APPLY的应用详解
SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能2011-10-10mdf文件和ldf文件导入到sql server 2005实现语句
导入mdf文件和ldf文件到数据库是网站搬家或者是初学者学习源码是必要的一步,接下来为大家详细介绍实现sql语句,感兴趣的你可不要错过了哈希望可以帮助到你2013-03-03无法在com+ 目录中安装和配置程序集 错误:-2146233087的解决方法[已测]
最近从脚本之家下载sql2005的部分朋友反应无法安装sql2005,今天在安装SQL Server2005时碰到了这个错误,到网上搜了一下,找到了解决办法,特记在这里,以备以后需要。2012-10-10
最新评论