• 締切済み

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% (295/459)
回答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

  • SQLite3にて重みづけを行った抽選のSQL

    お世話になります。 前回の質問にて、説明不足でしたので、 改めて質問させていただきました。 ID,name,point 1.りんご.30 2.みかん.22 3.いちご.18 4.バナナ.13 5.すもも.4 6.マンゴー.1 上記のようなデータがある場合、pointが高いほど 選ばれ易くするような重みづけのある抽選のSQLを 記述したいのですが、その方法を お教えいただけないでしょうか。 データベースはSQLite3(必須)を使用しています。 使用する言語はJava、C#を検討していますが、 極力コードには依存せずに、SQLiteだけで 完結させたいと考えています。 サンプルなどを掲示していただけますと幸いです。 以上、よろしくお願いいたします。

  • PHP SQL 問合せについて

    SQLについて質問いたします。SQL 全般でも結構です。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか?

  • PHP SQL 問合せについて

    PHP SQL 問合せについて http://okwave.jp/qa/q7689206.html での質問の続きとなります。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか? 回答 select * from tableA x order by (select count(*) from tableA y where y.name = x.name ) ,No で解決していますが、 select * from tableA x where name ='果物' とした場合、結果が異なります。 (結果が多い順にならない) 出現回数が多い順に並べるには、どのような記述になりますか? データには「果物以外のデータが含まれている」とします。 宜しくお願い致します。

    • 締切済み
    • PHP
  • SQLのsum関数

    こんにちは。 PostgresのSQLが思うように動いてくれません!! そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID  名前  数  場所  日付 0001 みかん 1  冷蔵庫 0901 0001 みかん 4  倉庫  0901 0001 みかん 1  冷蔵庫 0901 0002 いちご 1  部屋  0901 0002 いちご 2  部屋  0801 0003 きのこ 6  倉庫  0901 ★Bテーブル ID  名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前, a.数 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 たとえばこの場合、場所によってなど出てしまうものでしょうか? これはなぜなのでしょうか? よろしくお願いします。

  • エクセルのVBAについて

    エクセルのVBAに関することです。 例えば、50個のリストがあり、そこからランダムに10個選び出す。そのランダムに選び出す手順を10回繰り返す。ランダムに選んだ10セットをシートに書き出すやり方を教えてください。よろしくお願いします。 リスト        結果            1セット    2セット    3セット   ・・・・・・・ 10セット りんご       みかん     りんご    梨             キウイ   みかん       梨       バナナ    パイナップル      みかん 梨          いちご    みかん    キウイ          バナナ バナナ        :        :        :             : パイナップル       キウイ いちご ・ ・ ・ のような感じです。

  • エクセル 区切り位置について

    0408りんご 02495イチゴ 02578みかん 0365バナナ の場合 0408  りんご 02495  イチゴ 02578  みかん 0365  バナナ の様に数字と文字で分ける事は出来ますか? よろしくお願いします

  • エクセルで何件もあるコードと商品の件数を調べたい

    エクセルで コード 名称 009 りんご 005 みかん 009 りんご 003 バナナ 010 イチゴ 005 みかん 003 バナナ 001 ぶどう : : というようなデータが一万件近くあって、 コード 商品  件数 001 ぶどう  ○ 002 すもも  △ 003 バナナ  □ : : というように、コード順に、それぞれの商品の件数を調べてこういった表を作りたいのですがどうしたらいいでしょうか。

  • 言葉を並べる

    好きな食べ物は、りんごとみかんとバナナとイチゴとスイカです。 好きな食べ物は、りんご、みかん、バナナ、イチゴ、スイカです。 好きな食べ物は、りんご・みかん・バナナ・イチゴ・スイカです。 のどれが正しいですか?

  • SQLの条件検索について

    下記のような「果物TBL」というテーブルがあるとします。 果物TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - 01    りんご     150 02    バナナ     250 03    みかん     250 04    ぶどう     300 -------------------------------- また上記のテーブルと全く同じ構成の「果物検索TBL」というテーブルがあるとします。 そのテーブルには、例として下記のような値を入れておきます。 果物検索TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - NULL   りんご     250 NULL   バナナ     NULL -------------------------------- この時、下記のようなSQLだと SELECT DISTINCT 果物TBL.名前 FROM 果物TBL INNER JOIN 果物検索TBL ON (果物TBL.ID = 果物検索TBL.ID AND LEN(果物検索TBL.ID) > 0) OR (果物TBL.名前 = 果物検索TBL.名前 AND LEN(果物検索TBL.名前) > 0) OR (果物TBL.値段 = 果物検索TBL.値段 AND LEN(果物検索TBL.値段) > 0); -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ みかん りんご -------------------------------- という結果になります。(名前:りんご・バナナと値段:250のOR検索) その結果を -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ -------------------------------- という結果にするにはどうすればいいでしょうか?(名前:りんご・バナナと値段:250のAND検索、バナナのみマッチ) 単純にORをANDにしてもうまくいきませんでした。 動的にSQLを作れれば良いのですが、この構成は変えられないのでNULL値がネックになり分かりません。 教えてください。 また、記載してるSQLよりもっとスマートな書き方があれば教えてください。

  • 同じ行の中で重複するデータを削除してつめる方法

       A    B    C     D      E    F 1|りんご|いちご|りんご|ぶどう|ばなな|りんご 2|すもも|ばなな| 3|りんご|りんご|びわ | 4|かき |りんご|ばなな| データが上記のように記入されている場合、 下記のように、同じ行の中で重複するデータを削除してつめる方法をご伝授ください。     A    B    C     D      E    F 1|りんご|いちご|ぶどう|ばなな|  2|すもも|ばなな| 3|りんご|びわ | 4|かき |りんご|ばなな| よろしくお願いします。