SQLSERVER中分组取TOP

举报
JuneXCoder 发表于 2018/12/30 11:30:06 2018/12/30
【摘要】 SQLSERVER(2005以上的版本)对数据进行分组取TOP,可以用到row_number() over(partition by 列1 order by 列2 desc) ...

            SQLSERVER中(2005以上的版本)需要对数据进行分组取TOP,可以用到row_number() over(partition by 列1 order by 列2 desc) :表示根据[列1]分组,然后在分组内部根据[列2]排序。

示例SQL语句如下:

--1.创建测试表 
create table #班级成绩 
( 
姓名 varchar(20), 
科目 varchar(20), 
成绩 int 
) 

--2.插入测试数据 
insert into #班级成绩(姓名,科目,成绩) values('小李','语文',98) 
insert into #班级成绩(姓名,科目,成绩) values('小李','数学',80) 
insert into #班级成绩(姓名,科目,成绩) values('小李','英语',90) 
insert into #班级成绩(姓名,科目,成绩) values('王二','语文',88) 
insert into #班级成绩(姓名,科目,成绩) values('王二','数学',86) 
insert into #班级成绩(姓名,科目,成绩) values('王二','英语',88) 
insert into #班级成绩(姓名,科目,成绩) values('张玲','语文',60) 
insert into #班级成绩(姓名,科目,成绩) values('张玲','数学',86) 
insert into #班级成绩(姓名,科目,成绩) values('张玲','英语',88) 
insert into #班级成绩(姓名,科目,成绩) values('建林','英语',76) 
insert into #班级成绩(姓名,科目,成绩) values('建林','语文',98) 
insert into #班级成绩(姓名,科目,成绩) values('建林','数学',89) 
insert into #班级成绩(姓名,科目,成绩) values('吴冲','英语',78) 
insert into #班级成绩(姓名,科目,成绩) values('建林','语文',93) 
insert into #班级成绩(姓名,科目,成绩) values('建林','数学',85) 

--3.增加成绩排名
select 科目,姓名,成绩,ROW_NUMBER() over(PARTITION by 科目 order by 成绩 desc) as 排名 
from #班级成绩 

/*
row_number() over(partition by 列1 order by 列2 desc)
	表示根据 列1 分组,然后在分组内部根据 列2 排序,而此函数计算的值就表示每组内部排序后的顺序编号,可以用于去重复值
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.
*/

--4.取每个学科的前3名数据 
select * from 
( 
	select 科目,姓名,成绩,ROW_NUMBER() over(PARTITION by 科目 order by 成绩 desc) as 排名 
	from #班级成绩 
) T1 where T1.排名<= 3 order by 科目 

--5.删除临时表 
truncate table #班级成绩 
drop table #班级成绩

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。