SQL グループの平均と順位の算出方法を教えてください。


以下の様なデータベース(MYSQL)の構造になっている時に、各社の平均収入(income)のランク付けができるSQLを教えてください。

+---------+----------------+
| name | income |
+---------+----------------+
| C社 | 100|  
| C社 | 30| 
| C社 | 50| 
| B社 | 70| 
| A社 | 60| 
| A社 | 50| 
+---------+----------------+


結果

name income rank
A社 55 3位
B社 70 1位
C社 60 2位

また、A社とB社が同収入など、順位にタイが出た場合にも対応できるような方法を求めています。
SQLだけでなく、プログラム側(php)での操作を前提にしたものでも問題ありません。
よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/02/06 20:54:20
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:arayayamakun No.1

回答回数1ベストアンサー獲得回数1

ポイント200pt

PHP側での処理でも構わないなら、それこそjamisさんの過去の質問にある方法を使用すれば、わかりやすくできますよ。

まずは
SELECT * FROM tbl GROUP BY name


でグループ分けしておいて。
後は
http://q.hatena.ne.jp/1391162718
のいずれかの方法を使えば、思い通りの結果になるはずです。


SQLでまとめることもできるけど、少々ややこしいので私ならPHP側での処理を勧めますね。
グループでまとめて、PHPで順位付けすれば良いだけなので、そちらのほうが楽だと思います。

そんなに速度が変わらないなら、見やすくしておかないと、後で変更があったときなんかに困るんですよね。

そのレコード数が100万とかならPHPの方が遅くなると思うので、データベース側での処理が良いと思いますけど。

id:jamis

回答ありがとうございます。
グループ分けしてから、PHPで試してみたら、えらく簡単にできました。
データ量も多くないので、実行速度も全く問題なかったです。
まだまだ勉強が必要ですね。

2014/02/06 20:53:49
  • id:sibazyun
    順位にタイが出た場合にはどう対応させるのをご希望ですか。
    たとえば、1位が2社あったばあい、第3社は「2位」ですか、それとも「3位」ですか?
    1位の2社の出現順序は任意ですか、アルファベット/文字列順ですか?
    そういうことをかかないと、また、条件後付になりますよ。

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

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

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

回答リクエストを送信したユーザーはいません