Postgresqlで「ランダムで抽出した3件のレコードのみUPDATE」などということは可能でしょうか。

回答の条件
  • 1人2回まで
  • 登録:2006/07/03 17:58:16
  • 終了:2006/07/04 15:54:02

回答(2件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数752006/07/03 21:12:01

ポイント35pt

ランダムで抽出した3件のレコードを同じように更新して良いのであれば、以下のようなSQLはいかがでしょうか。

副問合せを使い、ランダムに抜き出した3件のidを含む行のcol1の値を'XXX'に、col2の値を'YYY'に更新します。

UPDATE sample
SET col1 = 'XXX' and col2 = 'YYY'
WHERE id IN (SELECT s2.id FROM sample s2 ORDER BY RANDOM() LIMIT 3)
;

それぞれ別の値に更新したいのであれば、SETの内容を変更し、LIMITを1に変更したものを3つ用意すれば良いです。

[参考URL]

参考になれば幸いです。

id:nandedarou No.2

nandedarou回答回数230ベストアンサー獲得回数342006/07/04 06:44:56

ポイント35pt

random()関数があるのでストアドプロシージャ(PL/pgSQL)でも可能だと思います。

PL/pgSQLを使って書くのが大変ならば、

他の言語でも乱数が発生できるので、上記のロジックで可能だと思います。

「ランダムで抽出した3件のレコードのみUPDATE」する手順は次のようになるのではないでしょうか?

1.主キー(重複がないならば、主キーでなくても可)

  のデータを抽出し、それを配列に入れる。

  (例えば、KeyArrayという配列など)

   

2.配列の要素数の範囲内で乱数を3つ発生させる

  その3つを例えば、r1 , r2 , r3 の3つの変数に格納する

 

3.KeyArray(r1) , KeyArray(r2) , KeyArray(r3)

が、「ランダムに抽出した3件の」主キーということになる

 

4.3で抽出したキーのデータをアップデートする

 

  • id:nandedarou
    3行目の「上記」は誤記です。正しくは「下記」。
     
    r1,r2,r3に格納する乱数を生成する際、
    重複してないかチェックする必要がありますので注意して下さい。
     
    3件のレコードを同じように更新して良いのであれば、
    bonlifeさんの方法の方が簡単ですね。
     
    勉強になりました。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません