• 締切済み

SQLで乱数を使った取得の工夫

お世話になります。 ID,name,point 1.りんご.30 2.みかん.22 3.いちご.18 4.バナナ.13 5.すもも.4 6.マンゴー.1 上記のようなデータがある場合、pointが高いほど 選ばれ易くするようなSQLを記述したいのですが、 その方法をお教えいただけないでしょうか。 ただのランダムであれば、『SELECT * FROM テーブル名 WHERE ID=abs(random()%全レコード数(この場合は6)+1』と すれば、均等にランダムで拾えますが、これを1のりんごのIDほど 取得しやすく、6のマンゴーほど発生しにくくするといった感じです。 以上、よろしくお願いいたします。

みんなの回答

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.4

 環境の記載が無いので、いったい、どこまでの構文が使える不明なので考え方だけ。  一つビューを作ります。  ビューのカラムは、元のテーブル全てのカラムに、pointの百分率の累計値を付け加えたものです。(もし、データが三桁の個数があるなら千分率に、四桁の個数があるなら、万分率にしてください)  100まで(千分率なら1000まで、万分率なら10000まで)の乱数を生成し、乱数の数値以下で且つ最大の累計値を持つレコードを選びます。  これで、ポイントの比率に従った確率で、ランダムなレコードが選定できます。  工夫すれば、ビューを生成しなくても一つのSQLで組めるかもしれませんが、利用できるselectの構文に依存します。  累計値が一つのSQLで生成できるかも、同じくです。

tatapatank
質問者

補足

回答、ありがとうございます。 説明不足にて申し訳ありません。 環境は、SQLite3を使用しています。 言語はJava.C#を使用しますが、極力 コードには依存せずに、SQLiteだけで 済ませたいと考えています。 回答いただきましたビューも、できれば 使用せずに内部だけで完結させたいと 思っています。 再度質問をさせていただきますので、 お答えいただければ幸いです。

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.3
tatapatank
質問者

補足

回答、ありがとうございます。 説明不足にて申し訳ありません。 環境は、SQLite3を使用しています。 言語はJava.C#を使用しますが、極力 コードには依存せずに、SQLiteだけで 済ませたいと考えています。 再度質問をさせていただきますので、 お答えいただければ幸いです。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

どのSQLを使うかによりますが、条件分岐を使えばよいのでは?

tatapatank
質問者

補足

回答、ありがとうございます。 説明不足にて申し訳ありません。 環境は、SQLite3を使用しています。 言語はJava.C#を使用しますが、極力 コードには依存せずに、SQLiteだけで 済ませたいと考えています。 再度質問をさせていただきますので、 お答えいただければ幸いです。

回答No.1

正確にはSQLでなくプロシージャーなどのような、インタープリターを求めているわけで。 だとしたら、動作環境を書かないと、なんの関数が使えるか、意味不明。

tatapatank
質問者

補足

回答、ありがとうございます。 説明不足にて申し訳ありません。 環境は、SQLite3を使用しています。 言語はJava.C#を使用しますが、極力 コードには依存せずに、SQLiteだけで 済ませたいと考えています。 再度質問をさせていただきますので、 お答えいただければ幸いです。

関連するQ&A