sqlが出てこなくて悩んでいます。

プレゼント応募者のDBがあるのですが、複数回応募した人については、重複を省いて、20人をランダムに抽出するようなSQLを作りたいのですが、実際に可能でしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:buriburimegurin No.1

回答回数25ベストアンサー獲得回数0

ポイント35pt

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に変えて読んでください。

id:onokun No.2

回答回数40ベストアンサー獲得回数2

ポイント15pt

http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti02.asp?...

オラクルマスターへの道:Silver実践講座(SQL編)

検索結果から重複をなくすには、応募者を抽出するSELECT文にDISTINCTをつけるなどすれば良いと思います。

ランダムな抽出は、標準のSQLではできないと思います。

抽選部分はストアドプロシージャを使用するか、抽出結果に対して別途プログラム側で処理することになると思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません