【Oracle】Over函数的用法

一、问题

如果一张表中有n个数据,分别属于a个小组,现在我们要求每个组里某个【字段】的最大值,最小值,和,差等聚合函数,该怎么操作?
举个具体点的例子,有一个表名为demo的oracle数据库表,有字段如ID【id】,名字【name】,年龄【age】,国家【country】4个字段,我们要求不同的国家,最大年纪的人的信息;
demo表的建表语句如下:

create table DEMO(
id varchar2(10) primary key not null,
name varchar2(10),
age varchar2(10),
country varchar2(10)
)

insert into demo(‘1’,‘刘备’,‘45’,‘蜀’);
insert into demo(‘2’,‘关羽’,‘42’,‘蜀’);
insert into demo(‘3’,‘张飞’,‘40’,‘蜀’);
insert into demo(‘4’,‘曹操’,‘47’,‘魏’);
insert into demo(‘5’,‘孙权’,‘21’,‘吴’);
insert into demo(‘6’,‘周瑜’,‘24’,‘吴’);

二、解决方法

我们先将所有记录按国家分组,倒序排序并标注序号值:
1.首先根据country分组,然后每组按照age字段倒叙排列,然后Rank()函数会将所有满足条件的记录排序;

select d.* ,Rank()Over(partition by d.country order by d.age desc) mm from demo d;

这样执行的结果就是这样:
在这里插入图片描述
这里的mm就是我们rank()函数排序后的序号;接下来,我们把mm等于1的值拿出来,就是各个国家年纪最大的值得记录:

select * from (
select d.*,rank()over(partition by d.country order by d.age desc) mm 
from demo d
)
where mm=1;

这样,就能获得年纪最大的记录的信息:
在这里插入图片描述

三、分析

如果我们用max+group by并且不适用over()函数来操作,那么可以实现么?
本文举的例子是可以实现的,但是如果遇到其他情况,可能会更复杂;用over()函数会更好一些;

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶洲川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值