Oracle高级查询之over(partition by…)

Oracle高级查询之over(partition by...)
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码 

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Oracle高级查询之over(partition by...),希望能够帮助大家进步!!!

现有表,数据如下:

Oracle高级查询之over(partition by…)

eg1:查询年龄第二的队员

通常写法:

select * from (select a.*, rownum r from (select t.* from l_student_info_tbl t order by t.sage desc) a) b where b.r = 2

看下a子句结果集:

Oracle高级查询之over(partition by…)

但如果时要统计每个年级,年龄第二大的,上面的sql就不行了,子句必须指定具体年级才可以按年级排序。

rank()/dense_rank() over(partition by ...order by ...)

现在导入一批东吴势力。

select e.* from (select e.*, rank() over(partition by e.sclassno order by e.sage desc) rank from l_student_info_tbl e) e where e.rank = 2;

结果:

Oracle高级查询之over(partition by…)

over:  在什么条件之上。
partition by e.sclassno:  按年级编号划分(分区)。
order by e.sage desc:  按年龄从高到低排序(使用rank()/dense_rank() 时,必须要带order by否则非法)
rank()/dense_rank():  分级

rank():  跳跃排序,如果有两个第一级时,接下来就是第三级。
dense_rank():  连续排序,如果有两个第一级时,接下来仍然是第二级

select e.* from (select e.*, dense_rank() over(partition by e.sclassno order by e.sage desc) rank from l_student_info_tbl e) e where e.rank = 4;

Oracle高级查询之over(partition by…)

select e.*from (select e.*,
rank() over(partition by e.sclassno order by e.sage desc) rankfrom l_student_info_tbl e) ewhere e.rank = 4;

看下子句,无rank=4的数据

 Oracle高级查询之over(partition by…)

 

转载于:https://www.cnblogs.com/xiaozhuanfeng/p/10757339.html

本文来源weixin_30595035,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/29873

发表评论