[英]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.