一個選項來做到這一點使用變量。
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
誠然,這是做一個漂亮的調皮事,但假設沒有在一個大陸的2個國家有着相同的,明顯估計的情況,似乎是這樣的混亂。先生,所有應有的尊重。已經有人說過......我沒有想到更好的解決方案。 –
一種替代方法是使用變量。或者是一個正確支持'row_number()','rank()'等的數據庫。 –