本番機のデータを適当に抜いてきたい時

OracleならSAMPLE関数を使えばすぐ出来ちゃうんですがこのSAMPLE関数、副問い合わせに使用できなかったりTBLに別名付けると動かなかったりちょっと融通が効きません。
そこで自分で強引にサンプリングする方法を考えてみる。

一応SAMPLE関数の例

これでテーブルの10%を任意にサンプリングしてくれます。
SELECT *
 FROM TEST 
      SAMPLE(10)
/

ROWNUMをつけてそれを元に3分の1にサンプリングする。

SELECT STR1,STR2 
  FROM (SELECT STR1,
               STR2,
               ROWNUM AS NO
          FROM TEST T1 
       )
 WHERE MOD(NO, 3) = 0
/

より適当にサンプリングしたい時は適当な列でソートしたり

SELECT STR1,STR2 
  FROM (SELECT STR1,
               STR2,
               ROW_NUMBER() OVER (ORDER BY STR2) AS NO
          FROM TEST T1 
       )
 WHERE MOD(NO, 3) = 0
/

完全にランダムな数字に拘ってみたり

SELECT STR1,STR2 
  FROM (SELECT STR1,
               STR2,
               ROW_NUMBER() OVER (ORDER BY TO_NUMBER(SUBSTR(TO_CHAR(DBMS_RANDOM.RANDOM()), - 5, 5))) AS NO
          FROM TEST T1 
       )
 WHERE MOD(NO, 3) = 0
/
ちなみに「TO_NUMBER(SUBSTR(TO_CHAR(DBMS_RANDOM.RANDOM()), - 5, 5))」の部分はOracleのランダムがマイナスも含んだりするのを補正しています。

10行のみサンプリングしたい等と母数が決まっているのならこちら。

SELECT STR1,STR2 
  FROM (SELECT STR1,
               STR2,
               DBMS_RANDOM.RANDOM() AS NO
          FROM TEST T1 
         ORDER BY NO
       )V1
 WHERE ROWNUM <= 10
/
広告を非表示にする