SQLZOO- 使用 GROUPBY 查找一个大陆上最大的国家;这可能吗?

Posted

技术标签:

【中文标题】SQLZOO- 使用 GROUPBY 查找一个大陆上最大的国家;这可能吗?【英文标题】:SQLZOO- using GROUPBY to find the largest country in a continent; is this possible? 【发布时间】:2018-11-04 03:27:31 【问题描述】:

我正在处理 SQLZOO 的一个练习题,但我不确定为什么我尝试的解决方案不起作用,因为它对我有意义。

这是表格的格式::

 -------------------------------------------------------------
|     name      continent    area    population       gdp     |
|-------------------------------------------------------------|
| Afghanistan     Asia      652230    25500100    20343000000 |
| .                                                           |
| .                                                           |
| .                                                           |
|                                                             |
 -------------------------------------------------------------

问题如下:

找到每个大陆最大的国家(按区域),显示大陆、名称和区域。

这是我想解决的方法:

SELECT continent, name, area 
  FROM world
 WHERE name IN (SELECT continent, name, MAX(area) 
                  FROM world 
                 GROUP BY continent);

我知道这行不通,但为什么不呢?似乎嵌套的 SELECT 语句正在查找每个大陆的面积为 MAX 的国家,不是吗?

对此的实际解决方案如下:

SELECT continent, name, area 
  FROM world x
 WHERE area >= ALL
    (SELECT area 
       FROM world y
      WHERE y.continent=x.continent
        AND area>0)

但这似乎是一种复杂的方法;;这种方式最有意义吗?任何想法表示赞赏

提前谢谢你!!

【问题讨论】:

【参考方案1】:

请试试这个查询,

SELECT a.continent, name, a.area
FROM
    (
        SELECT continent, max(area) as area
        FROM world 
        GROUP BY continent
        ORDER BY area desc
    ) a 
    join world b on a.area = b.area

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:
select continent, name, area 
from world x 
where area = All (select MAX(area) from world where x.continent = continent)

【讨论】:

【参考方案3】:
select continent, name, area
from
(select continent, name, area, rank() over(partition by continent order by area desc) as r1
from world) a
where a.r1 = 1

【讨论】:

【参考方案4】:

乍一看,这个查询似乎有效

SELECT continent, name, area 
  FROM world
 WHERE area IN (SELECT MAX(area) 
                  FROM world 
                 GROUP BY continent);

Demo 1

考虑到当前数据,在添加其他一些新记录时会出现一些问题,例如下面的演示。而不是上述更喜欢这个:

SELECT w1.continent, name, w1.area 
  FROM world AS w1
  JOIN (SELECT continent, MAX(area) AS area
          FROM world 
         GROUP BY continent) AS w2
    ON w1.continent = w2.continent
   AND w1.area = w2.area

Demo 2

【讨论】:

非常感谢!!你怎么这么快就想到了这个? 如果您不介意我问,您是如何对 SQL 如此熟悉的?我正在练习,但仍然不舒服。谢谢 不幸的是,这个答案是偶然的数据。如果某个大陆最大国家/地区的面积恰好与其他大陆第二大国家for example 的面积相同,它将返回额外的错误行。【参考方案5】:
select A.continent, W.name, A.area
from
(select continent, max(area) as area from world group by continent)A, world W
where
A.continent = W.continent
and
A.area = W.area

【讨论】:

以上是关于SQLZOO- 使用 GROUPBY 查找一个大陆上最大的国家;这可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

NOT IN vs IN 不返回免费结果

sqlzoo.net刷题5

SQL练习-SQLZOO SQLZOO:SELECT within SELECT Tutorial

SQL练习-SQLZOO SQLZOO:SELECT within SELECT Tutorial

SQL练习-SQLZOO SQLZOO:The JOIN operation

SQL练习-SQLZOO SQLZOO:The JOIN operation