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)