SQLの質問です。

学校の生徒のデータが入ってるテーブルがあります。
そのテーブルには、学生番号、名前、試験合計点が格納されます。
この状態で、特定の学生番号のデータについて、試験合計点が上から何位かを調べるにはどうしたら良いでしょうか。
例えば、学生番号99番の生徒が試験総合点260点だった場合、この生徒は上から何番目の点数かということです。
テーブルの構造を変える方法も検討して戴いて構いません。
よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/06/28 14:02:00
  • 終了:--

回答(5件)

id:nana21 No.1

nana21回答回数7ベストアンサー獲得回数02005/06/28 14:13:31

データにID番号を付けておきます。(オートインクリメントとか)

それで、合計点を上位からソートしたときの、特定の学生番号のIDを参照する、っていうのはどうでしょうか?

id:Lufini

生徒が10万人いて、調べた生徒が8万位とかだと、非常に時間がかかりそうです。

一発で取れるような方法は無いでしょうか。

極端な例ですみません。

2005/06/28 14:17:52
id:typista No.2

typista回答回数359ベストアンサー獲得回数72005/06/28 14:15:22

ポイント50pt

学生番号99の試験総合点数を求めて、それより大きい人が何人いるかをcountすれば良いと思います。

順位とのことなので、その人数に1を加えます。


SELECT COUNT(*)+1 FROM テーブル WHERE 試験総合点数 > (SELECT 試験総合点数 FROM テーブル WHERE 学生番号 = 99);

http://dev.mysql.com/doc/mysql/ja/subqueries.html

MySQL 4.1 リファレンスマニュアル :: 6.4.2 サブクエリ構文

サブクエリについて

SQLといっても、使用するDBMSによって多少記述の違いがあるようです。

http://www.rfs.jp/sitebuilder/sql/02/02.html#算術演算子:detail]

算術演算子について

id:Lufini

おお、素晴らしいです。

早速試してみます。

2005/06/28 14:28:15
id:dungeon-master No.3

dungeon-master回答回数571ベストアンサー獲得回数402005/06/28 14:16:27

ポイント5pt

http://www.hatena.ne.jp/ダミー:detail]

DBはなんでしょうね。

オラクルだったら

Select A.順位,A.学生番号 from

( select 点数,学生番号,ROWNUM as 順位 from テーブル ) as A

where A.学生番号=:知りたい学生の学生番号 ;

のように書けます。ちょっと古風かな。

id:Lufini

DBをお伝えしていませんでしたね。

PostgreSQLです。

2005/06/28 14:29:49
id:answer1414 No.4

answer1414回答回数503ベストアンサー獲得回数02005/06/28 14:18:22

http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html

SQLの基礎「SELECT」文を覚えよう

id:Lufini

深い意味がありそうな無さそうな…。

2005/06/28 14:30:53
id:ymlab No.5

ymlab回答回数508ベストアンサー獲得回数342005/06/29 01:00:10

ポイント25pt

擬似的にインデックスを用いればどうでしょう。


ソートは、母集団に対して大きく処理時間が変わります。


試験合計点を0-300とすると、30点ごと[まぁ何万人もいるとなれば、平均点付近は細かめ]に分割します。]に10分割ぐらいしておきます。


 次に、点数を更新する際にグループ内だけでソートします。

 新しく登録したデータには、順位情報をつけておき、10分割の上限下限を管理するTableを用意しておきます。

 この方法でどうでしょうか。

*30点ごとのところの説明

たとえば、f(x)=x**2のグラフを考えてください。

これのf(x)軸からみると、f(x)=0,1,2,4

のあたりは、密ですが、fx()=16,25,36などは、疎です。

 注目するべきところを、注目するということで、分割するべきポイントを決定するということです。

[0-30の集団よりも平均点が100とすると、90-120の集団の方がたくさんデータがありそうなのでそこらへんを細かく分割し、そのぶん

0-90あたりは荒く分割する]


ならば、

SELECT 順位 FROM テーブル WHERE 学生番号 = 99


で求められます。


ただ、10万人くらいの、3つくらいのデータでは、そんなに2日も3日もかからないと思うので、普通にソートする方法でもよいと思います。

id:Lufini

興味深い資料のご呈示ありがとうございます。

早速、拝見させて頂きます。

2005/06/29 09:53:20
  • id:ymlab
    ルーレット選択

     よかったら参考にしてください。
    このルーレット選択の、パーティションを分割点と考えて、平均付近のルーレットを小さく[分割]平均から遠くはなれたところをルーレットを大きく見積もって上げます。

    注:[本来のルーレット選択とは、大きく考え方が違います。]
    http://kyu.pobox.ne.jp/softcomputing/ga/ga5.html

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません