我是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。但是找不到这个问题的答案。任何帮助将不胜感激!
答案 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
子句对于根据大陆和人口设置当前和以前的行非常重要。这也可以处理关系,因为它会为具有相同人口的大陆中的所有国家分配相同的等级。
最初运行内部查询以查看变量的设置方式,这将为您澄清一些事情。
答案 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,依此类推..