2011-02-14 7 views
0

スキーマ:SQLクエリ最高3

Cereal 
Cereal_name 
Buyer_name 

Cereal_nameは穀物
Buyer_nameの名前ですが、私は、各穀物と番号を一覧表示しようとしています

一定の穀物をもたらした買い手であります購入した時間のうち、トップ4のシリアルを見つけます:回答の例は:

'HoneyNut' 400 
'Cap'n Crunch' 400 
'Chocolate Flakes' 300 
'Frosted Flakes' 200 

注:ther

Select Cereal_name, count(*) as numOfCount 
From Cereal 
Group By numOfCount Desc 

私は事前に

感謝をrowNum<=3を使用していたが、この場合ではその習慣仕事:!そのうちの一つは、私が持っているものと同じ番号

があるしているため、電子は、4です

+1

どのデータベースですか? –

+1

どのRDBMSを使用していますか? 'rowNum'はどこに定義されていますか? –

+0

私はDB2を使用しています。私はrownumが与えられていると思っていました。 – user308553

答えて

2

試してみてください。

SELECT * FROM 
(SELECT 
    Cereal_name, 
    COUNT(*) as numOfCount 
FROM Cereal 
GROUP BY numOfCount 
ORDER BY COUNT(*) DESC 
) CEREALS 
WHERE ROWNUM <= 3 

私はオラクルを仮定しました。

はDB2:

おそらくこの

が、私はわからない:

SELECT 
    Cereal_name, 
    COUNT(*) as numOfCount 
FROM Cereal 
GROUP BY numOfCount 
ORDER BY COUNT(*) DESC 
FETCH FIRST 3 ROWS ONLY 
+0

返事をありがとうが、wouldnt rownum <= 3は私にリストの最初の3行だけを与えますか?購入者の数に同点がある場合、それは上位3行以上のものになるから – user308553

+0

@ user308553:ROWNUMは最初の3行を返しますが、selectからselectを選択して適切なものを取得する必要があります。 – LukLed

+0

申し訳ありません私はSQLにまだまだ慣れていません。select *を実行するポイントを理解できません。ROWNUM <= 3 – user308553

1

あなたがそこにあなたを取得する必要があり、標準のANSI SQLの窓関数を使用して、DB2の互換モードを使用できない場合は、次の

 
select * 
from (
    select t1.*, 
     dense_rank() over (order by cereal_count) as rank 
    from (
    select cereal_name, 
      count(*) as cereal_count 
    from cereal 
    group by cereal_name 
) t1 
) t2 
where rank <= 3 
order by rank desc 
+0

OPがネクタイを表示したい – RichardTheKiwi

+0

ありがとう、私は例を編集しました –

1

これは多分ですか?

SELECT G.Cereal_name, G.numOfCount 
FROM (
    Select Cereal_name, count(*) as numOfCount 
    From Cereal 
    Group By Cereal_name) G 
inner join (
    Select DISTINCT count(*) as numOfCount 
    From Cereal 
    Group By Cereal_name 
    order by numOfCount Desc 
    FETCH FIRST 3 ROWS ONLY) C on C.numOfCount = G.numOfCount 
order by G.numOfCount DESC