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 /