【问题标题】:SQL Join 3 tables with conditions (Max value)SQL Join 3个表的条件(最大值)
【发布时间】:2021-11-24 19:26:55
【问题描述】:

我有一个关于在某些条件下加入 3 个表的问题。

我有 3 张表,国家、地区、城市。我想要的只是返回每个国家人口最多的城市,并排除人口为 100.000 或更少的城市。问题是每个表都与传递给下一个表的 id 相连。让我详细说明:

国家/地区表:

id iso_code name
1 IN India
2 US United States

区域表:

id country_id name
3 1 Delhi
4 1 Manipur
5 2 Nevada

城市表:

id region_id name population
6 3 New Delhi 320.000
7 3 Delhi 10.000.000
8 4 Imphal 220.000
9 5 Las Vegas 624.000

输出应如下所示:

Country City
India Delhi
United States Las Vegas

我做了很多研究,但似乎找不到解决方案。 提前谢谢你。

【问题讨论】:

  • '排除人口为 1.000.000 或更少的城市。' - 那么为什么你的输出中有 las vegas?
  • 我删除了冲突的标签;请标记您实际使用的RDBMS。
  • 你说得对,我的意思是 100.000 谢谢你注意到@P.Salmon
  • row_number()的案例
  • 'I mean 100.000' in thet case new delhi and imphal 应该出现?

标签: sql


【解决方案1】:

将它们从外键连接到主键。
添加基于国家和人口的排名。
将其包装在子查询中。
然后对其进行过滤。

SELECT Country, City
FROM
(
    SELECT
      ctry.name AS Country
    , ctry.iso_code AS CountryCode
    , reg.name AS Region
    , city.name AS City
    , city.population AS CityPopulation
    , DENSE_RANK() OVER (PARTITION BY ctry.id ORDER BY city.population DESC) AS Rnk
    FROM Country AS ctry
    JOIN Region AS reg ON reg.country_id = ctry.id
    JOIN City AS city ON city.region_id = reg.id
) q
WHERE Rnk = 1
  AND CityPopulation > 100000
ORDER BY CityPopulation DESC, Country, City

请注意,我使用 DENSE_RANK 而不是 ROW_NUMBER。
不同之处在于 DENSE_RANK 会将相同的数字分配给具有相同人口的国家/地区的城市。但是 ROW_NUMBER 不会。
这样一来,如果有 2 个城市在他们的国家中都排在前列,那么它们的 Rnk 都为 1。

如果您不希望一个国家/地区可能拥有超过 1 个顶级国家/地区。然后改用 ROW_NUMBER,但要使用决胜局。

F.e.

, ROW_NUMBER() 
        OVER (PARTITION BY ctry.id 
              ORDER BY city.population DESC, 
                       LEN(city.name) DESC) AS Rnk

【讨论】:

  • 和“我只想返回每个国家人口最多的城市”?哦等等,它们现在就被退回了......?
  • 对,最大。等一下。
  • 非常感谢您的回答,但我的实际表格要大得多,我认为“WHERE city.population > 500000”不会有帮助,因为我需要 MAX() 函数跨度>
  • 已更改。假设您的数据库足够现代,可以拥有 DENSE_RANK 或 ROW_NUMBER 等窗口函数。
猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2019-07-13
  • 2015-10-26
  • 2020-09-15
  • 2016-10-14
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多