【问题标题】:SQL return based on Aggregate Function基于聚合函数的 SQL 返回
【发布时间】:2013-03-12 16:01:17
【问题描述】:

我有这个有效的查询,但它返回所有城市的信息,我只想根据一个国家/地区每一行的城市最大人口返回,但聚合函数不能在 where 子句中使用。如何将我的结果限制为每个国家/地区一个?

SELECT lab6.country.name, max(lab6.city.population) AS largest_pop 
  FROM lab6.country, lab6.city 
 WHERE lab6.country.country_code = lab6.city.country_code 
 GROUP BY lab6.country.name, lab6.city.name"

【问题讨论】:

  • 你在用什么RDBMSRDBMS 代表关系数据库管理系统RDBMS is the basis for SQL,适用于所有现代数据库系统,如 MS SQL Server、IBM DB2、Oracle、MySQL 等...
  • 这是今天第三次被问到这个问题,来自同一个家庭作业。我很高兴老师们知道 SO,但也许学生应该做好更好的准备和指导,以便他们自己回答。
  • 我是在寻求帮助理解,而不是让别人为我做家庭作业。
  • 您确实应该提供示例值和示例结果,以使自己清楚地回答这样的问题。误解和浪费时间的方式太多。

标签: sql postgresql aggregate-functions


【解决方案1】:

PostgreSQL 支持您可以利用的窗口函数。

SELECT  countryName, cityName, largest_pop
FROM
        (
            SELECT  a.name countryName, 
                    b.name cityName, 
                    b.population AS largest_pop,
                    DENSE_RANK() OVER (PARTITION BY a.name 
                                        ORDER BY b.population DESC) rn
            FROM    lab6.country a, lab6.city b 
            WHERE   a.country_code = b.country_code 
        ) x
WHERE   rn = 1

【讨论】:

    【解决方案2】:

    也许我误会了,但您只想返回每个国家/地区最大的城市吗?

    如果是这样,您只需按国家/地区分组,而不是按国家/地区城市。您需要在GROUP BY 语句中包含标识国家/地区的属性以及该国家/地区的名称。您的查询最终将如下所示:

    SELECT lab6.country.name AS cName, max(lab6.city.population) AS largest_pop 
    FROM lab6.country, lab6.city 
    WHERE lab6.country.country_code = lab6.city.country_code 
    GROUP BY lab6.country.country_code, lab6.country.name
    

    如果您还想包含最大城市的名称,您首先需要决定如果有多个最大城市(有两个或多个城市的人口相同且最大的国家/地区)该怎么做。我假设您可以将它们全部包含在内。在这种情况下,您可以简单地在 FROM 子句中执行子查询,加入具有相同人口的城市:

    SELECT lc.cName, lab6.city.name, lc.largest_pop
    FROM (
          SELECT lab6.country.country_code AS cCode
                 lab6.country.name AS cName, 
                 max(lab6.city.population) AS largest_pop 
          FROM lab6.country, lab6.city 
          WHERE lab6.country.country_code = lab6.city.country_code 
          GROUP BY lab6.country.country_code, lab6.country.name
         ) AS lc
         JOIN lab6.city ON lc.cCode = lab6.city.country_code 
    WHERE lab6.city.population = lc.largest_pop
    

    【讨论】:

    • 是的,我想返回最大的城市,但城市名称与国家/地区不同。示例 lab6.city.name 和 lab6.country.name
    • 所以如果我在 SELECT 语句中插入 lab6.city.name 我必须将它放在 GROUP BY 子句中。
    • 所以您还想要包括最大城市的名称,而不仅仅是人口?您可能希望在问题中包含该特定信息。
    • 是的,那在 lab6.city 表中,但我不知道如何包含它而不必将它放在导致太多结果的 GROUP BY 中
    • 好的,我已经把一些应该可以工作的东西放在一起。查看我的编辑。
    猜你喜欢
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多