1

このクエリは機能しますが、すべての都市の情報を返します。1 つの国の各行の都市の最大人口に基づいてのみ返したいのですが、where 句では集計関数を使用できません。検索結果を国ごとに 1 つに制限するにはどうすればよいですか?

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

最大の都市の名前も含めたい場合は、最初に複数の大都市 (人口が同じ最大の都市が 2 つ以上ある国) がある場合の対処方法を決定する必要があります。それらすべてを含めても問題ないと思います。その場合、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 に答える