はじめに
データ抽出の設計業務を行っております。
使い慣れたテーブルからの簡単な処理ならデータ調査をしなくても実績があるのでわかりますが、「この要件をどうやったら満たせるんだ…こんなの初めて……」という時は実際のデータを見て逆算的に考えています。
あくまで調査に時間をかけたくないのでちょろっと見ることができればいいや~くらいなので以前にLIMIT句便利!!という記事を書きました。
ただLIMIT句
ってWHERE句
に確定した条件を記載して、「よっしゃ合ってる!」って見るには便利なのですが、どういう風にデータが動いているかを全体で確認したい時は上の方から取得してくるので足りないんですよね。
なのでランダムで取得したい、ただいちいち乱数振ってソートするのを書くのがめんどくさいので調べてみました。
環境はOracleです。
なぜランダムに取得しなくてはならないの?
SAMPLE句
はデータをランダムで取得してくれます。
LIMIT句
は取得するデータの上限件数を指定できます。
全体で50件くらいならそのまま取得して見れば良いんですけど、そうじゃないから悩んでいるし何万件も取得するので処理自体も時間かかるしそんなの見られる訳がないしめんどくさい。
例として以下のuserテーブルがあり、住所が更新されたらupdateflg
が下記の定義と設計されているとします。
updateflgの定義
- "0" :初期登録
- "1" :更新
- "2":削除
id | name | gender | age | address | updateflg |
---|---|---|---|---|---|
1 | AAA | 1 | 20 | 東京都港区 | 0 |
1 | AAA | 1 | 20 | 東京都千代田区 | 1 |
1 | AAA | 1 | 20 | null | 2 |
2 | DDD | 2 | 30 | 埼玉県さいたま市 | 0 |
2 | DDD | 2 | 30 | 神奈川県横浜市 | 1 |
3 | EEE | 2 | 20 | 神奈川県横須賀市 | 1 |
3 | EEE | 2 | 20 | 東京都中野区 | 1 |
4 | FFF | 1 | 32 | 神奈川県横浜市 | 0 |
4 | FFF | 2 | 20 | 神奈川県横須賀市 | 2 |
id1
は初期登録⇒更新⇒削除で住所は変わって、削除されたらnullになっている。
id2
は初期登録⇒更新で住所が変わっている。
なので、定義に沿ったフラグの立ち方をしています。
id3
は更新⇒更新で住所は変わっていますが、初期登録どこ行った?
id4
は初期登録⇒削除ですが、なんで住所が残っている?
なので、定義に沿っていない。
どこか別のテーブルで何かの動きがあるのでは?
これを正しく取得するにはどうしたらいいかを考えなければなりません。
ただLIMIT句
だと上から取得するので奇跡的にid1
・id2
の綺麗な動きをしているデータしか取得できず、定義に沿っていない部分を拾えない可能性があります。
なのでランダムに取得して、色々なデータパターンを見たいというのが目的です。
SAMPLE句が便利すぎる件
そこでSAMPLE句
の活躍です。
SELECT id,address,updateflg
FROM user sample(10)
sample(10)
の(10)
はuser
テーブルから10%取得してきてあげるね、ということです。
個人的に10%取得できれば網羅できると思っているので私は大体10で指定します。
1万件なら1,000件になるので上の方バーーっと見ればid3
・id4
のような変な子が大抵見つかるので、「変な子いる!」となったらそのidをWHERE句
で直接指定して他のテーブルと結合してピンポイントで調査します。
今回例に出したのは単純なテーブルですが、登録日時とかが項目にある場合は(大抵ある)登録日時を1か月分のみに絞ったりします。
それでも多いならsample(5)
で5%の取得でもパターン網羅はできるのではないでしょうか?
調査したいデータのボリュームに合わせて色々試してみると良いと思います。
おわりに
終始めんどくさいので、を理由にしていますがめんどくさいから効率的にできないかを常に考えて調べて新しい知識を得ていって自然にスキルアップとなると考えています。
地道な作業が必要なときも勿論多いですが、「めんどくさい…これどうにかならんのか…」と常に疑問を持って調べて試すことで効率化にも繋がってスキルも手にしてと良いことだらけだと思うので今後も「めんどくさい」という気持ちを忘れずに精進していきたいです!