我有一张名为 bbc(名称、地区、面积、人口、gdp)的国家/地区表
我想要一张按地区列出最大(人口最多)国家的地区、名称和人口的表格。到目前为止,我已经尝试过:
SELECT region, name, MAX(population)
FROM bbc
GROUP BY region
它给了我一条错误消息:ORA-00979: Not a GROUP BY Expression
我试图更改为 GROUP BY 区域、名称,但它没有给我正确的表
我有一张名为 bbc(名称、地区、面积、人口、gdp)的国家/地区表
我想要一张按地区列出最大(人口最多)国家的地区、名称和人口的表格。到目前为止,我已经尝试过:
SELECT region, name, MAX(population)
FROM bbc
GROUP BY region
它给了我一条错误消息:ORA-00979: Not a GROUP BY Expression
我试图更改为 GROUP BY 区域、名称,但它没有给我正确的表
您可以对这样的查询使用分析:
SELECT name, region, population
FROM (SELECT region, name, population
, MAX(population) OVER (PARTITION BY region) maxpop
FROM bbc)
WHERE population = maxpop;
内联视图为您提供了一个看起来像您的基表的表,以及一个包含该地区最大人口的额外列。您的顶级选择会为您提供每个地区最大国家/地区的国家、地区和人口。
用一个有限的例子来说明:
SELECT * FROM bbc;
REGION NAME POPULATION
--------------- ------- ----------
North America USA 300000000
North America Canada 100000000
North America Mexico 50000000
South America Brazil 50000000
South America Argentina 40000000
South America Venezuela 20000000
添加解析函数:
SELECT region, NAME, population
, MAX(population) OVER (PARTITION BY region) maxpop
FROM bbc;
REGION NAME POPULATION MAXPOP
--------------- ------- ---------- ----------
North America USA 300000000 300000000
North America Canada 100000000 300000000
North America Mexico 50000000 300000000
South America Brazil 50000000 50000000
South America Argentina 40000000 50000000
South America Venezuela 20000000 50000000
然后成品:
NAME REGION POPULATION
------- --------------- -----------
USA North America 300000000
Brazil South America 50000000
再编辑一次。您可以避免嵌套选择,但不能避免子查询:
SELECT NAME, region, population
FROM bbc
WHERE (region, population) IN
(SELECT region, MAX(population)
FROM bbc
group by region);
这是最简单和最短的方法,因为Oracle有元组测试,它可以使代码更短:
首先,获取每个区域的最大人口:
SELECT region, MAX(population)
FROM bbc
GROUP BY region
然后针对它测试国家:
select region, name, population
from bbc
where (region, population) in
(SELECT region, MAX(population)
FROM bbc
GROUP BY region)
order by region
如果要支持许多 RDBMS,请使用 EXISTS:
select region, name, population
from bbc o
where exists
(SELECT null -- neutral. doesn't invoke Cargo Cult Programming ;-)
FROM bbc
WHERE region = o.region
GROUP BY region
HAVING o.population = MAX(population) )
order by region
这里测试的查询,都有相似的输出:http ://sqlzoo.net/0.htm
http://www.ienablemuch.com/2010/05/why-is-exists-select-1-cargo-cult.html
在绝大多数花瓶中,ORA-00979 错误是由于 GROUP BY 子句中未包含非聚合列而导致的。在这种情况下,您还需要在 GROUP BY 子句中包含名称。此外,您不应在 FROM 语句中调用 MAX 函数。
SELECT region, name, MAX(population)
FROM bbc
GROUP BY region, name