分区函数 Partition By 与 row_number() 的用法 & 排序rank()的用法详解(获取分组(分区)中前几条记录)
partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,分区函数一般与排名函数一起使用。
准备测试数据:
create table Student --学生成绩表 ( id int, --主键 Grade int, --班级 Score int --分数 ); insert into Student values(1,1,88); insert into Student values(2,1,66); insert into Student values(3,1,75); insert into Student values(4,2,30); insert into Student values(5,2,70); insert into Student values(6,2,80); insert into Student values(7,2,60); insert into Student values(8,3,90); insert into Student values(9,3,70); insert into Student values(10,3,80); insert into Student values(11,3,80);
结果:
一、分区函数Partition By的与row_number()的用法
1、不分班按学生成绩排名
select *,row_number() over(order by Score desc) as Sequence from Student
执行结果:
2、分班后按学生成绩排名
select *,row_number() over(partition by Grade order by Score desc) as Sequence from Student
执行结果:
3、获取每个班的前1(几)名
select * from ( select *,row_number() over(partition by Grade order by Score desc) as Sequence from Student ) T where T.Sequence<=1
执行结果:
二、分区函数Partition By与排序rank()的用法
1、分班后按学生成绩排名 该语句是对分数相同的记录进行了同一排名,例如:两个80分的并列第2名,第3名就没有了
select *,rank() over(partition by Grade order by Score desc) as Sequence from Student;
执行结果:
2、获取每个班的前2(几)名,该语句是对分数相同的记录进行了同一排名,例如:两个80分的并列第2名,第3名就没有了
select * from ( select *,rank() over(partition by Grade order by Score desc) as Sequence from Student ) T where T.Sequence<=2
执行结果:
参考链接:
https://www.cnblogs.com/linJie1930906722/p/6036053.html
Code your future.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2018-10-25 DRF JWT的用法 & Django的自定义认证类 & DRF 缓存