2017-01-03 109 views
1

我是MySQL的初學者,在過去的幾天裏我偶然發現了這一點。如何在每個mysql查詢組中獲得第n個最高分項

比方說,我有一個國家表如下所示:

code name   continent  Population 
ABW Aruba    North America 103000 
AFG Afghanistan   Asia   22720000 
AGO Angola    Africa   12878000 
AIA Anguilla   North America 8000 
ALB Albania    Europe   3401200 
AND Andorra    Europe   78000 
ARG Argentina   South America 37032000 

此表有每個國家的陸地和人口的信息。

如何找到每個大陸人口最多的國家?

對於一個特定的情況,我如何找到每個大陸第三人口最多的國家?

我檢查了很多SO問題,包括這個link。但找不到這個問題的答案。任何幫助將不勝感激!

回答

1

一個選項來做到這一點使用變量。

select code,name,continent,population 
from (
select c.*, 
@prevPopulation:[email protected], 
@curPopulation:=population, 
@prevContinent:[email protected], 
@curContinent:=continent, 
case when @curContinent = @prevContinent and @prevPopulation <> @curPopulation then @rn:[email protected]+1 
    when @curContinent = @prevContinent and @prevPopulation = @curPopulation then @rn:[email protected] 
else @rn:=1 end as rank 
from country c, 
(select @rn := 0, @curContinent := '',@prevContinent := '', @curPopulation:=0,@prevPopulation:=0) r 
order by continent,population desc 
) x 
where rank = 3 --replace it with the nth highest value needed 

此查詢使用4個變量

1),其最初被設置爲一個空字符串@curContinent。此後select分配當前行的大陸。

2)@prevContinent最初設置爲空字符串。此後,select將其設置爲@curContinent值(最初爲空字符串)。

3)@curPopulation最初設置爲0.此後select分配當前行的總體。

4)@prevPopulation最初設置爲0.之後,select將其設置爲@curPopulation(第一次爲0,依此類推)。

order by條款對於設計基於大陸和人口的當前和以前的行很重要。這也可以處理聯繫,因爲它可以將相同的排名賦予一個擁有相同人口的大陸上的所有國家。

最初運行內部查詢以查看變量是如何設置的,這將爲您澄清事情。

Sample Demo

1

假設沒有國家有相同的人口,再一個方法是計算具有相同或更高的人口的國家的數量和看到當計數爲3:

select c.* 
from country c 
where (select count(*) 
     from country c2 
     where c2.continent = c.continent and c2.population >= c.population 
    ) = 3; 
+0

誠然,這是做一個漂亮的調皮事,但假設沒有在一個大陸的2個國家有着相同的,明顯估計的情況,似乎是這樣的混亂。先生,所有應有的尊重。已經有人說過......我沒有想到更好的解決方案。 –

+2

一種替代方法是使用變量。或者是一個正確支持'row_number()','rank()'等的數據庫。 –

1
 with result as 
     (
     select code,name,continent,population,dense_rank() over(order by population) as rnk 
     from dbo.country 
     ) 
     select population,continent from result where rnk=3 group by continent,population ; 

如果你想在第二高的人口然後輸入where子句中RNK爲2等..

+0

這也是我的想法。其他人更乾淨。 – Edward

相關問題