みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

各クラスの上位2名SQL

クラス|出席番号|点数
1 |1 |77
1 |2 |88
1 |3 |40
2 |1 |75
2 |2 |83
2 |3 |33
3 |1 |22
3 |2 |55
3 |3 |66

上記のようなデータがある場合に各クラスの上位2名(計6名)を選出するSQLを教えて下さい。

投稿日時 - 2015-11-03 09:45:15

QNo.9074112

困ってます

質問者が選んだベストアンサー

前回のSQL、タイプミスしてました。
下記に訂正します。

select * from table_name as t1
where 出席番号 in (
select 出席番号 from table_name as t2
where t1.クラス = t2.クラス
order by 点数 desc limit 2);

動作確認もしました。下記で確認してください。

http://sqlfiddle.com/#!15/d2f72/1

あるいは、クラスが3つだけなら、union でマージしてもいいですね。

(select * from table_name where クラス = 1 order by 点数 desc limit 2)
union all
(select * from table_name where クラス = 2 order by 点数 desc limit 2)
union all
(select * from table_name where クラス = 3 order by 点数 desc limit 2)
;

投稿日時 - 2015-11-05 05:26:56

お礼

ありがとうございました。動作確認しました。

なぜそうなるかがいまいち理解出来ていないですが、これから考えてみたいと思います。

投稿日時 - 2015-11-05 07:53:20

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

PostgreSQL なら、下記でどうでしょうか。(動作確認はしてません。)
Top 2 を limit 2 に変更しただけですが。

select * from table_name as t1
where 出席番号 in
(select 出席番号 as t2 from where t1.クラス = t2.クラス order by 点数 desc limit 2);

投稿日時 - 2015-11-04 14:22:55

お礼

ありがとうございます。

出席番号はユニークでは無いため、多分だめのような気がします。
(動作確認はしてません。)

投稿日時 - 2015-11-04 17:18:34

ANo.1

データベースが何か分かりませんが、SQL Server か Access なら
とりあえず下記でどうでしょうか。

SELECT A.* FROM テーブル名 A
WHERE A.出席番号 In (SELECT TOP 2 出席番号 FROM テーブル名 B WHERE A.クラス=B.クラス ORDER BY 点数 DESC);

投稿日時 - 2015-11-03 18:24:47

お礼

postgresを想定しています。

自己レスですが。。。

select * from table_name where (クラス, 出席番号) in (
(select  クラス,出席番号 where クラス = 1 order by 点数 desc limit 2)
union
(select  クラス,出席番号 where クラス = 2 order by 点数 desc limit 2)
union
(select  クラス,出席番号 where クラス = 3 order by 点数 desc limit 2)
);

こんな風に思いつきました

投稿日時 - 2015-11-03 19:31:47

あなたにオススメの質問