1

クエリで各国の都市の最大人口を取得しようとしています。都市と国のテーブルは 2 つのテーブルにあるため、結合する必要があり、国コードを使用してそれらを結合します。

次のクエリがあります。

SELECT country.name         AS country, 
       city.name            AS city, 
       Max(city.population) AS max_pop 
FROM   country 
       INNER JOIN city 
               ON( country.country_code = city.country_code ) 
GROUP  BY country.name, 
          city.name 
ORDER  BY country.name ASC; 

私の思考プロセスは、結合されたテーブルから国名、都市名、および max を取得することでした。私は、最大で1つの結果しか得られないことを想定してテストしましたが、この場合は複数の結果が得られます! グループを実行するために、都市と国の両方の名前をグループに入れています。

考え?

4

2 に答える 2

2

Much shorter and faster with DISTINCT ON (PostgreSQL extension to the SQL standard):

SELECT DISTINCT ON (1)
       co.name       AS country
      ,ci.name       AS city
      ,ci.population AS max_pop
       -- add more columns as you please
FROM   country co
JOIN   city    ci USING (country_code)
ORDER  BY 1, 3 DESC, 2;

If two cities have the equally largest population in one country, I pick the alphabetically first in this case. That's why I added the positional parameter 2 (for ci.name) to the ORDER BY clause.

I also simplified with table aliases and a USING equi-join.

About DISTINCT ON:

于 2013-03-12T03:37:21.873 に答える
2
SELECT co.name         AS country,
       ct.name         AS city, 
       t.pop AS max_pop 
FROM country AS co
      INNER JOIN (
               SELECT country_code, Max(population) AS pop FROM city GROUP BY country_code
             ) t ON co.country_code = t.country_code 
      INNER JOIN city AS ct ON ct.population = t.pop AND co.country_code = ct.country_code 
ORDER  BY country.name ASC; 
于 2013-03-12T02:21:05.727 に答える