1

我有这个有效的查询,但它返回所有城市的信息,我只想根据一个国家/地区每一行的城市最大人口返回,但聚合函数不能在 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"
4

2 回答 2

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
于 2013-03-12T16:07:27.687 回答
0

也许我理解错了,你只想返回每个国家最大的城市吗?

如果是这样,您只需按国家/地区分组,而不是按国家城市分组。您需要在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
于 2013-03-12T16:20:50.430 回答