2016-07-13 12 views
0

私はkhanacademyのSQLコースをやっており、私はthisデータセットで遊んでいます。列ランク(主キー)、国、人口などが含まれます。グローバルな人口の平均に近い国を選択したいと思います。世界人口平均が30mの場合、20〜40mの人口を持つ国を選択したいと考えています。人口が平均に近い国を選択してください

今、私はいくつかのことを試みましたが、うまくいきませんでした。 This questionは似ている、と私はこのような答え変更しようとした。しかし

SELECT a.country, a.population, b.max_pop 
FROM countries_by_population a 
INNER JOIN (
    SELECT rank, MAX(population) as max_pop 
    FROM countries_by_population 
    GROUP BY rank 
) b ON a.rank = b.rank 
WHERE a.population > b.max_pop*0.9; 

、すべての行を返し、max_popはこの国のためだけの集団です。私は別のところで働いていないので、テーブルに自分自身を参加させるより簡単な解決策があるはずです。それは何ですか?

答えて

0

ここで最も重要な違いは、group by rankがないことです。

select * 
from countries_by_population 
where population * 3.000/(select avg(population) from countries_by_population) 
    between 2 and 4 
0
SELECT 
    a.country, 
    a.population 
FROM 
    countries_by_population a 
WHERE 
    ABS((a.population - (select AVG(population) from countries_by_population))/a.population) < .1 
0

SQLで作業する場合、セルフジョインは非常に一般的ですが、それらを恐れないでください。この場合、必要はありません。

クエリでは、プライマリキーであるランク別にグループ化していますので、もちろんすべての行を取得します。また、実際にコード内のどこにでもAVG()を使用していません。あなたは、あなたの目標数を与え、それが数であるかのように、あなただけの直接そのクエリに比較を行うことができ、あなたのwhere句でます

(SELECT AVG(population) from countries_by_population) 

のようなネストされたクエリを持っている必要があります。

関連する問題