一、问题
如果一张表中有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()函数会更好一些;