学校の生徒のデータが入ってるテーブルがあります。
そのテーブルには、学生番号、名前、試験合計点が格納されます。
この状態で、特定の学生番号のデータについて、試験合計点が上から何位かを調べるにはどうしたら良いでしょうか。
例えば、学生番号99番の生徒が試験総合点260点だった場合、この生徒は上から何番目の点数かということです。
テーブルの構造を変える方法も検討して戴いて構いません。
よろしくお願いします。
データにID番号を付けておきます。(オートインクリメントとか)
それで、合計点を上位からソートしたときの、特定の学生番号のIDを参照する、っていうのはどうでしょうか?
学生番号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]
算術演算子について
おお、素晴らしいです。
早速試してみます。
http://www.hatena.ne.jp/ダミー:detail]
DBはなんでしょうね。
オラクルだったら
Select A.順位,A.学生番号 from
( select 点数,学生番号,ROWNUM as 順位 from テーブル ) as A
where A.学生番号=:知りたい学生の学生番号 ;
のように書けます。ちょっと古風かな。
DBをお伝えしていませんでしたね。
PostgreSQLです。
http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
SQLの基礎「SELECT」文を覚えよう
深い意味がありそうな無さそうな…。
擬似的にインデックスを用いればどうでしょう。
ソートは、母集団に対して大きく処理時間が変わります。
試験合計点を0-300とすると、30点ごと[まぁ何万人もいるとなれば、平均点付近は細かめ]に分割します。]に10分割ぐらいしておきます。
次に、点数を更新する際にグループ内だけでソートします。
新しく登録したデータには、順位情報をつけておき、10分割の上限下限を管理するTableを用意しておきます。
この方法でどうでしょうか。
http://kyu.pobox.ne.jp/softcomputing/ga/ga1.html
SoftComputing lab.
*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日もかからないと思うので、普通にソートする方法でもよいと思います。
興味深い資料のご呈示ありがとうございます。
早速、拝見させて頂きます。
生徒が10万人いて、調べた生徒が8万位とかだと、非常に時間がかかりそうです。
一発で取れるような方法は無いでしょうか。
極端な例ですみません。