假设我有一个表和查询:
由特定大陆某一特定国家的人口组成 我想返回各国平均(人口)和如果国家的人口大于大陆,则大陆平均人口数量为+3基本上我想过滤掉与小计大陆值有一定差异的行。
我对此进行了修改并认识到数据没有多年,并且数字显然是垃圾,但这只是一个例子。
create table abc (continent varchar2(30), country varchar2(30), population number, yr number)
insert into abc values ('africa', 'kenya', 50, 2005)
insert into abc values ('africa', 'egypt', 100, 2006)
insert into abc values('africa', 'south africa', 35, 2007)
insert into abc values ('africa', 'nigeria', 200, 2008)
insert into abc values ('asia', 'china', 50, 2005)
insert into abc values ('asia', 'india', 100, 2006)
insert into abc values('asia', 'japan', 35, 2007)
insert into abc values ('asia', 'korea', 200, 2008)
select continent, country, avg(population)
from abc
where ------population for each country > 3+ avg for each continent
----should return egpyt/nigeria rows and india/korea rows since average here is 96.25 for each continent.
group by rollup(continent, country)
答案 0 :(得分:1)
因此,将大陆平均值定义为该大陆所有行的平均值,解决方案可以是:
select continent
, country
, avg(population) country_avg
, max(continent_avg) continent_avg
from (
select continent
, country
, population
, avg(population) over (
partition by continent
) continent_avg
from abc
)
group by continent, country
having avg(population) > max(continent_avg) + 3
order by continent, country;
我询问大陆平均值的定义的原因是,如果一个大陆的某些国家的表格中有更多的行(=更多年份),那么这些国家的平均权重会更多。然后另一种选择可能是大陆平均值是国家平均值的平均值,在这种情况下解决方案可以是:
select *
from (
select continent
, country
, avg(population) country_avg
, avg(avg(population)) over (
partition by continent
) continent_avg
from abc
group by continent, country
)
where country_avg > continent_avg + 3;
如果这些国家/地区的年数相同(行数相同),则两种解决方案应该给出相同的结果。但是,如果国家/地区的年数不同,您必须选择符合您要求的解决方案。