2

データベースクラスに問題があり、理解できません。

私は次のような郡と呼ばれるテーブルを持っています:

state_code | name | population
           |      |
           |      | 

(各state_code内には複数の郡があります)

ちょうどである状態と呼ばれる別のテーブルがあります

state_code | name 
           |
           |

とにかく、スキーム(state_name、county_name、county_population)を返すクエリが必要です。このクエリは、州名の順に、各州で最も人口の多い5つの郡名を人口の降順でリストします。

適切なスキームを生成するクエリがありますが、上位5つだけでなく、結果が多すぎます。

SELECT state.name AS state_name, county.name AS county_name, county.population 
FROM state JOIN county ON state.code = county.state_code 
GROUP BY state.name, county.name, county.population
ORDER BY state.name, county.population DESC

私はランキングを含むより複雑な解決策を試みましたが、私たちの学校には、非常に困難なPARTITION OVERまたはRANK()がないPostgreSQLバージョン8.3しかありません。

ありがとう

4

2 に答える 2

2
select state_name, county_name, population
from (
    select
        s.name state_name,
        c.name county_name,
        c.population,
        row_number() over(partition by s.state_code order by population desc) rn
    from
        states s
        inner join
        counties c on s.state_code = c.state_code
) s
where rn <= 5
order by state_name, population desc

row_number ウィンドウ関数は、各状態内の行に番号を付けます。外側のクエリでは、行数を 5 以下に制限しています。

于 2012-10-27T19:18:55.240 に答える
0

このソリューションは信じられないほど遅くて苦痛ですが、あなたが望むものを与えるはずだと私は信じています. 誰かがよりエレガントなソリューションを思いつくことができるかどうかを知りたいです。

 SELECT state.name AS state_name, county.name AS county_name, county.population
 FROM state JOIN county ON state.code = county.state_code
 WHERE  county.name IN (SELECT county.name, COUNT(*) FROM county
          INNER JOIN county AS second_county ON (county.name = second_county.name) AND 
          (county.state_code = second_county.state_code) AND (county.population < state.population) GROUP BY county.name HAVING COUNT(*) <=5)
GROUP BY state.name, county.name, county.population
ORDER BY state.name, county.population DESC
于 2012-10-27T19:17:48.033 に答える