2013-03-12 69 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