2013-03-12 67 views
1

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

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" 
+0

什么[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)您正在使用? 'RDBMS'代表*关系数据库管理系统*。 'RDBMS是SQL'的基础,并且适用于所有现代数据库系统,如MS SQL Server,IBM DB2,Oracle,MySQL等...... – 2013-03-12 16:02:16

+0

我正在使用pgSQL – 2013-03-12 16:03:17

+0

这是今天第三次提出这个问题,从同样的家庭作业中出来。我很高兴老师意识到这一点,但也许学生应该做好更好的准备和指导,以便他们自己回答。 – 2013-03-12 16:38:39

回答

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 
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 
+0

是的,我想要返回最大的城市,但城市名称与国家不同。示例lab6.city.name和lab6.country.name – 2013-03-12 16:25:40

+0

所以如果我在SELECT语句中插入lab6.city.name,我必须将它放在GROUP BY子句中。 – 2013-03-12 16:27:09

+0

所以你还想要包括最大城市的名字,而不仅仅是人口?您可能希望在您的问题中包含特定的信息位。 – Wilduck 2013-03-12 16:27:19