2016-10-14 3 views
2

Я работаю в Postgres 9.4. У меня есть таблица с булевым полем include_in_rct и около 5000 строк. Я хотел бы случайным образом присвоить это значение как true или false для всех существующих строк с вероятностью 50% в любом направлении. Могу ли я сделать это в Postgres?Postgres: вставить случайное логическое значение в поле?

мне нужно сделать что-то вроде:

UPDATE mytable SET include_in_rct(<random boolean>) 

Или я мог бы установить значение Ложные для каждой строки, а затем сделать что-то вроде этого:

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

Какой самый лучший подход?

+2

'ГДЕ случайный()> 0.5' должно работать, если он обеспечивает соответствующие случайные значения –

ответ

4

я могу думать о двух способов:

Сначала с помощью random()

update mytable 
    set include_in_rct = random() > 0.5; 

Это не обязательно иметь точное распределение 50%.

Чтобы получить точное распределение 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

Второй пример не будет обновлять случайные строки, он будет обновлять каждый четную строку в своем текущем состоянии. Тем не менее, 'row_number() over (order by random())' возможно может обновлять случайные строки с 50% -ным распределением (я знаю, что это будет неэффективно, но в случае 5000 строк это не имеет большого значения) , – pozs

+0

@pozs: ну второй оператор обновит строки с 50% -ным распределением ложных и истинных значений - но да, это не «случайный», –

Смежные вопросы