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