如何获取每组mysql查询中的第n个最高条目

时间:2017-01-03 01:59:17

标签: mysql sql

我是MySQL的初学者,过去几天我偶然发现了这一点。

假设我有一张国家/地区表格如下所示:

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。但是找不到这个问题的答案。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

假设没有国家拥有相同的人口,那么一种方法是计算拥有相同或更高人口的国家数量,并查看计数何时为3:

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

答案 1 :(得分:1)

执行此操作的一个选项是使用变量。

select code,name,continent,population 
from (
select c.*, 
@prevPopulation:=@curPopulation,
@curPopulation:=population,
@prevContinent:=@curContinent,
@curContinent:=continent,
case when @curContinent = @prevContinent and @prevPopulation <> @curPopulation then @rn:=@rn+1
     when @curContinent = @prevContinent and @prevPopulation = @curPopulation then @rn:=@rn
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 :(得分: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,依此类推..