繁体   English   中英

使用最小/最大的子查询

[英]Subqueries using min/max

一些国家的人口是其任何邻国(在同一大陆)的三倍以上。 给国家和大洲。

在此处输入图像描述

来自https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial ,问题 10

我试过这个:

SELECT w.name, w.continent 
FROM world w
WHERE w.population/3 > (SELECT min(w2.population) 
                      FROM world w2
                      WHERE w2.continent = w.continent);

该解决方案似乎有效:

SELECT w.name, w.continent 
FROM world w
WHERE w.population > (SELECT 3 * MAX(w2.population) 
                      FROM world w2
                      WHERE w2.continent = w.continent AND
                            w2.name <> w.name
                     );

我试图理解我的解决方案中的逻辑缺陷。

为什么要使用max()而不是min() ,因为我们想比较人口是否是非洲大陆人口最少的国家的 3 倍?

在最小/最大场景中我们是否需要w2.name <> w.name 为什么?

是任何邻居的三倍以上

意思是,同一大陆上第二高的人口必须少于三分之一,并且每个大陆只有一个国家可以合格。 (大陆上的最低人口不相关。)

第二个查询获取同一大陆上的所有国家,除了外部查询中的国家( w2.name <> w.name ),找到人口最多的国家并乘以 3。如果仍然低于外部国家的人口查询,它通过了条件。

此外,虽然是优雅的 SQL,但查询代价高昂,因为必须为每一行评估一次相关子查询 这应该更便宜:

SELECT *
FROM  (
   SELECT DISTINCT ON (continent)
          name, continent, population
        , lead(population) OVER (PARTITION BY continent ORDER BY population DESC) AS next_population
   FROM   world
   ORDER  BY continent, population DESC
   ) sub
WHERE  population > 3 * next_population;

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM