プレゼント応募者のDBがあるのですが、複数回応募した人については、重複を省いて、20人をランダムに抽出するようなSQLを作りたいのですが、実際に可能でしょうか?
PostgreSQLの場合ですが、random()関数によって並び替えのキーを計算して行う方法を考えました。
下記のようなテスト用テーブルを作成して試してみました。
Column | Type | Modifiers
-----------+-----------------------+-----------------------------------------------------------
oubo_id | integer | not null
oubo_name | character varying(30) |
oubo_idはシーケンス(ユニークです)
oubo_nameは応募者の名前です。(今回、これを重複しないようにしました)
データはテスト用に8件だけなのですが...
> select * from test;
oubo_id | oubo_name
---------+-----------
1 | hanako
2 | hanako
3 | hanako
4 | taro
5 | jiro
6 | saburo
7 | siro
8 | goro
(8 rows)
ご質問では任意の20人とありますが、3人でテストしてみます。
(実際にはViewを使って、応募者単位のレコードを取得するか、もしくはテーブルを分割して、
複数回応募してきた人も1レコードのみ作成として、子テーブルに内容をぶら下げるべきだと
思うのですが、とりあえずは平たいテーブルで考えた苦肉の策です。)
select oubo_name
from (
select * from
(select max(oubo_id) oubo_id,oubo_name from test group by oubo_name) sum_test) ran_test
order by random()*oubo_id limit 3;
実行結果です。
=> select oubo_name from ( select * from (select max(oubo_id) as oubo_id,oubo_name fro
m test group by oubo_name) sum_test) ran_test order by random()*oubo_id limit 3;
oubo_name
-----------
hanako
taro
siro
(3 rows)
=> select oubo_name from ( select * from (select max(oubo_id) as oubo_id,oubo_name fro
m test group by oubo_name) sum_test) ran_test order by random()*oubo_id limit 3;
oubo_name
-----------
siro
saburo
hanako
(3 rows)
検索するたびに異なった結果が出てきますがいかがでしょう?
#3を20に変えて読んでください。
http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti02.asp?...
オラクルマスターへの道:Silver実践講座(SQL編)
検索結果から重複をなくすには、応募者を抽出するSELECT文にDISTINCTをつけるなどすれば良いと思います。
ランダムな抽出は、標準のSQLではできないと思います。
抽選部分はストアドプロシージャを使用するか、抽出結果に対して別途プログラム側で処理することになると思います。
コメント(0件)