• ベストアンサー

各クラスの上位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を教えて下さい。

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

  • ベストアンサー
回答No.3

前回の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) ;

muuming2001
質問者

お礼

ありがとうございました。動作確認しました。 なぜそうなるかがいまいち理解出来ていないですが、これから考えてみたいと思います。

その他の回答 (2)

回答No.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);

muuming2001
質問者

お礼

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

回答No.1

データベースが何か分かりませんが、SQL Server か Access なら とりあえず下記でどうでしょうか。 SELECT A.* FROM テーブル名 A WHERE A.出席番号 In (SELECT TOP 2 出席番号 FROM テーブル名 B WHERE A.クラス=B.クラス ORDER BY 点数 DESC);

muuming2001
質問者

お礼

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) ); こんな風に思いつきました

関連するQ&A

  • SQL文の書き方

    お世話になります。 テーブルに 顧客名 括り番号 番号 あああ 100    200 あああ 100    201 あああ 100    202 いいい 101    203 いいい 101    204 あああ 102    205 とデータがあるとします。 顧客名 括り番号 番号 あああ 100    200~202 いいい 101    203~204 あああ 102    205 とデータを取得したいとき、 1回のSQLで取得できますか? 教えてください。

  • Excelで上位だけ表示

    過去質問にもあったのですが、他の方法はないのかと思いまして質問させてください…。今日昨日はじめたばっかりのド素人なので過去質問読みましたが理解できませんでした;; まず、表で、 出席番号・名前・点数・順位(1 山田太郎 435 1など) を表示して、その下に上位3人のデータを表示するというものです。 自分でVLOOKUPを使ってどうにかしようとしたのですが、色々やってみたものの失敗続きでして... VLOOKUPとLARGEあたりでできますでしょうか? 順位はRANKで表示しています

  • Microsoft AccessのSQL 抽出についての質問

    Microsoft AccessのSQL 抽出についての質問 今は手元にこのソフトがないのですが、 例えば、 <成績データ> 社員番号  名前  点数  0701   大橋   68  0702   田中   54  0703   斎藤   82  0704   松本   73 こんな感じのデータがあったとして、80点以上の人を抽出する場合、 そのSQL文っていうのはどうすればいいのでしょうか? SELECT ??? FROM 成績データ WHERE 点数>=80 って感じだと自分は考えているのですが、 これで正しいでしょうか?というかSELECTのところに何をいれればいいのかよくわかりません 教えてください。

  • 特定の人の最高を出すようなSQL

    例えば単純化して 出席番号と点数と登録時刻を登録すようなテーブルにて seiseki table bangou int //出席番号 tensu int //点数 instime timestamp//登録時刻 出席番号1番の人が20 点 25点 40点という成績を順にとって 1 20 2014-01-04 1 40 2014-03-20 1 25 2014-05-11 とレコードがあった場合 一番点数がよいレコードの登録期日を求めるにはどうやったらよいでしょか・・・

  • 上位ディレクトリ名(フォルダ名)を取得するには?

    phpファイルが入っている、2階層上位のディレクトリ名(フォルダ名)を取得したいと思っています。 例 http://~.com/aaa/bbb/ccc/test.php test.phpが本体です。 ここから2階層上位のディレクトリ名、ここでは「bbb」を取得するような事はできないでしょうか? test.phpの中に、2階層上位のディレクトリ名を記述したいと思っています。 具体的に言うと、 $name = "●●●"; 上記の●●●に、2階層上位のディレクトリ名を入れたいです。 同じようなファイルが多数あり、「bbb」には様々なフォルダ名があり、test.phpの1つ1つを書き換えるのに手間がかかるので、ディレクトリ名を自動的に取得できれば助かります。 phpの知識がほとんどないため、お力をお借りできればと思い、質問させて頂きました。 アドバイスをお願い致します。

    • ベストアンサー
    • PHP
  • SQL文でフィールド名に空白を含んでいるとき

    CSVファイル検索の際のSQL文のことですが、フィールド名に半角空白を含んでいるものがあります。この場合の書き方についてアドバイスいただけないでしょうか。 例  where 科目 = keyword 上記の科目に 「未 払 金」のように空白を含んだものがある。 #Replaceは違うようで・・。レコードに空白があるのならわかりますが・・。 #上記SQL文は簡単にしてあり、そのままの書き方ではありません。

  • 検索SQLについて

    SQL初心者です。 SQL文1つで以下のようなことをしたいんですが いい方法が思いつかなくて大変困ってします。 いい方法がありましたら教えてください。 以下のようなデータがあるとして 電話番号、商品名 、日付 、数量 00000001、商品AAA、2004/10/10、1 00000001、商品AAA、2004/10/10、2 00000001、商品BBB、2004/10/10、1 00000002、商品AAA、2004/10/09、2 00000002、商品AAA、2004/10/10、1 00000003、商品AAA、2004/10/10、1 00000003、商品AAA、2004/10/10、1 電話番号と商品名が同じ場合は (1)日付(降順) (2)数量(昇順) の順に比較して1つだけに絞って取得したい 「取得結果」 電話番号、商品名 、日付 、数量 00000001、商品AAA、2004/10/10、1 00000001、商品BBB、2004/10/10、1 00000002、商品AAA、2004/10/09、2 00000003、商品AAA、2004/10/10、1 よろしくお願いします。

  • SQLについて教えてください。

    SQLについて質問があります。 あるテーブルの項目が、倉庫名、商品名、在庫数量とあった場合、 違う倉庫にある同一商品が数件あったとします。 例えば、  A倉庫 商品●● 10個  B倉庫 商品●● 20個  C倉庫 商品●● 5個  A倉庫 商品×× 3個  B倉庫 商品×× 15個  C倉庫 商品×× 0個 上記のような場合、●●商品についてはどれも在庫が1個以上 あるので通常に3件取得したいのですが、××商品はC倉庫が在庫0個です。 上記の様に0個の件数が1件でもあったら、その商品については 取得しない様なSQL式を1発で組むことは可能でしょうか? (上記の例の場合、●●商品3件のみ取得したい) 何故、SQL初心者で初歩的な質問で申し訳ありませんが よろしくお願い致します。

  • MySQLで変数やループ、上位3名を求める方法

    お世話になります。早乙女遙佳と申します。 Webサイト上から会員名や点数を入力し、 送信ボタンが押されると、 受け取ったCGI側でDBに書き込み、 今月成績の良かった方、上位3名は○○さんと○○さんと○○さんです というサイトを作りたいと思っています。 データベースは、MySQLを使って学習していますが、 教えていただけますでしょうか? scoreテーブルとして、以下のテーブルを作っています。 会員の毎月の点数と、先月からの点数の増加分を格納するテーブルです。 ID name score month increment 1 taro 100 11 0 2 jiro 200 11 0 3 taro 50 10 0 4 jiro 250 10 0 /* 今月の点数を求める */ SELECT score AS thisMonthScore FROM `score` WHERE name = 'taro' AND MONTH = '11'; /* 先月の点数を求める */ SELECT score AS prevMonthScore FROM `score` WHERE name = 'taro' AND MONTH = '10'; /* 点数の増加分を書き込む */ UPDATE `score` SET `increment`= 50 WHERE name = 'taro' and month = '11'; 質問1 上記のUPDATE文では、増分を書き込むために、 `increment`= 50 としていますが、 upScore = thisMonthScore - prevMonthScore `increment`= upScore のように書けたらと思うのですが、できないものでしょうか? 質問2 WHERE name = 'taro' の様に各会員の氏名を書いていますが、 「すべての会員についてループさせる」 様にはできないでしょうか? 擬似コードですが memberName = select name from `score`; //会員名の配列 memberCount = select count('name') as cnt from `score`; //会員数 for (i = 0; i < memberCount; i++){  thisMonthScore = SELECT score AS thisMonthScore FROM `score` WHERE name =  memberName[i] AND MONTH = '11'; //今月の点数  prevMonthScore = SELECT score AS prevMonthScore FROM `score` WHERE name = memberName[i] AND MONTH = '10'; //先月の点数  upScore = thisMonthScore - prevMonthScore; //点数の増加分  UPDATE `score` SET `increment`= upScore WHERE name = memberName[i] and month = '11'; //DBの更新 } のようなイメージです。 DBの呼び出し元であるCGIでループを書けばもちろんできるのですが、 SQL文で処理させた方が速いのかなとも思ったりもしたのですが、 通常、どのように書くものでしょうか? 毎月100件、1年で1000件、10年分で10000件くらいのレコード数になりますが、このくらいであればあまり速度などは気にせずとも良いものでしょうか? 質問3 成績の良かった方、上位3名を抽出するにはどのようなSQL文になるでしょうか? 第一位 taroさん 50点 第二位 jiroさん -50点 第三位 saburoさん -100点 のような感じです。 初歩的な質問で恐縮ですが、 どうぞ、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL内での計算に関して

    SQLでこんな事ができないかと考えています。 実際のデータの内容として、発注データと仕入データが存在し、結果として 発注残の数量を拾いたいと考えています。 1、発注データ 発注番号、品名、数量・・・・ 2、仕入データ 仕入番号、発注番号、数量・・・・ ※ 仕入は分納もある為、1つの発注番号に対し、複数データが存在します。 結果として、  発注番号、発注残数量 これらを繋ぎ合わせ、なんとか1つのSQLで発注残が取得できないかと 考えていますが、不可能でしょうか? これをプログラムで作成する事は可能かと思われますが、かなりボリュームが 大きくなってしまう為、SQLでなんとかならないかと考えています。 教えて下さい。 よろしくお願いします。