人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: Lufini
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:SQL データ 名前 学校 学生
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● nana21
●0ポイント

http://park18.wakwak.com/~little-box/Dreamweaver/ultra411.htm

SQL:ソート

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

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

◎質問者からの返答

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

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

極端な例ですみません。


2 ● typista
●50ポイント

http://pc5.2ch.net/test/read.cgi/php/1011683282/301-400

mysql ヘルプ!

学生番号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]

算術演算子について

◎質問者からの返答

おお、素晴らしいです。

早速試してみます。


3 ● dungeon-master
●5ポイント

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

DBはなんでしょうね。

オラクルだったら

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

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

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

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

◎質問者からの返答

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

PostgreSQLです。


4 ● answer1414
●0ポイント

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

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

◎質問者からの返答

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


5 ● ymlab
●25ポイント

http://kaiunix.cs.shinshu-u.ac.jp/Lesson/DataBase/2004/POSTGRE/i...

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


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


試験合計点を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日もかからないと思うので、普通にソートする方法でもよいと思います。

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ