2015-11-17 40 views
1

我正在使用Mondial數據庫模式,並試圖查找:對於每個國家/地區,找到擁有最高人口和城市人口的城市。對於每個國家/地區,請查找擁有最高人口和城市人口的城市

現在我有:

SELECT Country.Name, city.name, MAX(city.population) Population 
FROM city 
Join Country 
On Country.Code=City.Country 
WHERE city.population IS NOT NULL 
GROUP BY Country.Name, city.name 
ORDER BY Country.Name; 

這給了我每個國家的城市,其人口,而不僅僅是大城市的ALL

+0

您應該提供表格create和insert語句作爲示例數據。至少在SQL Fiddle中構建簡單模式並將其鏈接到問題。我們沒有你的「城市」和「國家」表。此外,你應該顯示所需的輸出,而不是用文字解釋。除非與它相關,否則不要添加[tag:sqlplus]。你的問題與Oracle SQL有關,而SQL * Plus是一個客戶端工具。請參閱[**如何提出問題**](http://tkyte.blogspot.de/2005/06/how-to-ask-questions.html) –

+1

[必須出現在GROUP BY子句中或在一個聚合函數中使用](http://stackoverflow.com/questions/19601948/must-appear-in-the-group-by-clause-or-be-used-in-an-aggregate-function) – Sebas

回答

2

使用分析功能。像這樣的東西應該工作(未經測試):

select 
    country.name, 
    city.name, 
    city.population 
from 
    country 
join 
(
    select 
    country, 
    name, 
    population, 
    row_number() over (partition by population desc) as rn 
    from 
    city 
) city on 
    city.country = country.code 
    and city.rn = 1 
order by 
    country.name 
-1

不能使用MAX在多個選擇 試試這個:

SELECT Country.Name, city.name, city.population 
FROM city 
Join Country 
On Country.Code=City.Country 
WHERE city.population IS NOT NULL and city.population in (SELECT MAX(population) FROM city limit 1) 
GROUP BY Country.Name, city.name 
ORDER BY Country.Name; 
+0

什麼如果兩個城市有相同的人口?你會加倍你的結果集。 – Lock

+0

你不想那樣? – Cr1xus

+0

只需在country.name – Cr1xus

2

不知道oracle中,但如果在SQL Server上完成它可以這樣做:

Select * from 
     (select 
     Country.Name, 
     city.name, 
     city.population, 
     ROW_NUMBER() over(partition by Country.Name order by Country.Name,city.population desc) RowNum 
    from Country inner join city city on Country.Code=City.Country) tbl 
    where RowNum = 1 

功能類似於甲骨文ROW_NUMBER幫助。
希望這個幫助。

0

這似乎工作。

根據包含聚合函數的列過濾查詢結果也很有用。

SELECT ct.name AS "Country", c1.name AS "City", c1.population AS "Population" 
FROM city c1 
    JOIN country ct 
    ON c1.country = ct.code 
WHERE c1.population = (SELECT max(population) 
         FROM city c2 
         WHERE c1.country = c2.country) 
ORDER BY country