SQL返回基于聚合函数

时间:2013-03-12 16:01:17

标签: sql postgresql aggregate-functions

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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