2016-10-14 1 views
2

Ich arbeite in Postgres 9.4. Ich habe eine Tabelle mit einem booleschen Feld namens include_in_rct und mit etwa 5000 Zeilen. Ich möchte diesen Wert zufällig auf alle vorhandenen Zeilen mit einer Wahrscheinlichkeit von 50% in jeder Richtung als wahr oder falsch zuweisen. Kann ich das in Postgres machen?Postgres: zufälligen booleschen Wert in Feld einfügen?

Ich brauche so etwas zu tun:

UPDATE mytable SET include_in_rct(<random boolean>) 

Oder ich könnte den Wert auf False für jede Zeile, dann tun so etwas wie dieses Set:

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

Was ist der beste Ansatz?

+2

WHERE random()> 0.5' sollte funktionieren, wenn es richtig Zufallswerte –

Antwort

4

Ich denke an zwei Möglichkeiten: Das wird nicht unbedingt eine genaue 50% Verteilung

Erste random()

update mytable 
    set include_in_rct = random() > 0.5; 

verwenden.

Um eine genaue 50/50 Verteilung erhalten Sie verwenden können:

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; 

Dies setzt voraus, dass id ist der Primärschlüssel der Tabelle.

Die erste wird jedoch schneller sein, aber für nur 5000 Zeilen ist es egal.

+0

Das zweite Beispiel aktualisieren wird nicht zufällig Zeilen liefert, wird es jeder selbst aktualisiert in seinem aktuellen Zustand zu bringen. Ein 'row_number() over '(order by random())' könnte jedoch zufällige Zeilen mit einer Verteilung von 50% aktualisieren (ich weiß, dass es nicht sehr effektiv ist, aber im Fall von 5000 Zeilen ist es nicht wichtig) . – pozs

+0

@pozs: Nun, die zweite Anweisung wird die Zeilen mit einer 50% igen Verteilung von falschen und wahren Werten aktualisieren - aber ja, es ist nicht "zufällig" –

0

Immer K.I.S.S.

select round(random()); 
Verwandte Themen