SQLSERVER中分组取TOP
【摘要】 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 #班级成绩
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)