ここから本文です

ランダムにレコードを選択(100件中10件など)するクエリをSQLで書けますか?パ...

tie********さん

2017/5/217:03:35

ランダムにレコードを選択(100件中10件など)するクエリをSQLで書けますか?パフォーマンスは気にしませんが、出現確率が均等か指定した比重の通りになるようにしたいです。できるだけ標準SQL出お願いします。

補足また、そのクエリをご教示願います。

閲覧数:
78
回答数:
3

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

原沢信道さん

2017/5/516:19:02

RDBMSで異なる仕様の部分を使う必要が有るので、とりあえずSQL Serverの場合で回答します。ただし、高い確率で乱数に同じ値の物が発生し、必ず10件とはなりません、必ず10件にしたい場合は乱数に同じ値が有った場合の対処が必要であり、1個のSQLではかなり難しいのでプログラムを作って対応する必要が有ると考えます。
SELECT CLMN FROM
(SELECT CLMN,ROW_NUMBER() OVER(ORDER BY CLMN) AS NMBR
FROM TBL)T
WHERE NMBR IN
(SELECT ROUND(RAND()*99,0,1)+1 AS R UNION
SELECT ROUND(RAND()*99,0,1)+1 UNION
SELECT ROUND(RAND()*99,0,1)+1 UNION
SELECT ROUND(RAND()*99,0,1)+1 UNION
SELECT ROUND(RAND()*99,0,1)+1 UNION
SELECT ROUND(RAND()*99,0,1)+1 UNION
SELECT ROUND(RAND()*99,0,1)+1 UNION
SELECT ROUND(RAND()*99,0,1)+1 UNION
SELECT ROUND(RAND()*99,0,1)+1 UNION
SELECT ROUND(RAND()*99,0,1)+1)

  • 質問者

    tie********さん

    2017/5/608:27:24

    詳しい解説をいただきありがとうございます。教えていただいた方法でできました。重複を除くには手続き言語を使用するしかないと気が付きました。SQLは簡単に見えて奥が深いという感想です。メンテナンス性を考えると手続きの考えで書いた方がすっきりする気もします。Oracleで試しました。

    create global temporary table trand(val int);

    insert into trand
    select floor(dbms_random.value(0,
    (select count(distinct caption) from tcand))) val from dual;

    select distinct c3.rk, c3.caption from
    (select caption, (select count(distinct caption)
    from tcand c2 where c2.caption < c1.caption) rk from tcand c1, trand) c3
    where c3.rk in(select val from trand);

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/5/6 11:31:08

結果としてこんな感じになるんだろうと思いました。大変勉強になりました。ありがとうございました。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

nor********さん

2017/5/502:47:51

標準SQLには乱数を返す関数はないですね。

それでもほとんどのRSBMSでRAND関数が使えます。
ただ、細かいところで仕様が異なります。

http://blog.kimuradb.com/?eid=716709

ORACLEはDBMS_RANDを使います。
http://oracle.se-free.com/plsql/d7_random.html

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

2017/5/310:25:25

そのテーブルが、
・プライマリキーとして「単純な数値のidを1つだけ」持っている
・その数値idは、歯抜けがなく数値がきれいに連続している
(必ずしも0または1から始まっている必要はない)

のであれば、多分できると思います。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる