2016-10-14 6 views
2

私はPostgres 9.4で作業しています。私はinclude_in_rctというブール値のフィールドと約5000行のテーブルを持っています。すべての既存の行に対して、この値をtrueまたはfalseとして無作為に割り当て、いずれの方向にも50%の確率で割り当てる必要があります。 Postgresでこれを行うことはできますか?Postgres:ランダムブール値をフィールドに挿入しますか?

UPDATE mytable SET include_in_rct(FALSE) 
UPDATE mytable SET include_in_rct(TRUE) WHERE id IN <some random set of 50% of IDs> 

最善のアプローチは何ですか:

UPDATE mytable SET include_in_rct(<random boolean>) 

または私は行ごとに値をFalseに設定することができが、このような何か:

は、私のような何かをする必要がありますか?

+2

'WHEREランダム()は、適切なランダムな値 –

答えて

4

私は2つの方法を考えることができます。

まずこれは必ずしも正確な 50%の分布を持っていませんrandom()

update mytable 
    set include_in_rct = random() > 0.5; 

を使用。あなたが使用することができ、正確な50/50分布取得するには

:この

update mytable 
    set include_in_rct = (rn % 2 = 0) 
from (
    select id, row_number() over (order by random()) as rn 
    from mytable 
) x 
where x.id = mytable.id; 

idがそのテーブルの主キーであることを前提としています。

ただし、最初の方が高速ですが、5000行では問題になりません。

+0

第二の例は、ランダム行が更新されませんを提供する場合> 0.5'、動作する必要があり、それはすべてのも、現在の状態の行更新されます。しかし、 'row_number()over(order by random())'はランダムな行を50%の分布で更新する可能性があります(それは非常に効果的ではありませんが、5000行の場合はそれほど重要ではありません) 。 – pozs

+0

@pozs:2番目のステートメントは、偽値と真値の50%分布で行を更新しますが、それは "ランダム"ではありません –

0

常にK.I.S.S.

select round(random()); 
関連する問題