[英]SQL help with MAX query
我有一張名為 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 為您提供每個地區最大國家的國家、地區和人口。
用一個有限的例子來說明:
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
添加解析 function:
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,但不能避免子查詢:
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
這里測試的查詢,都有類似的 output: 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 function。
SELECT region, name, MAX(population)
FROM bbc
GROUP BY region, name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.