2016-10-14 2 views
2

나는 Postgres 9.4에서 일하고있다. include_in_rct이라는 부울 필드가 있고 약 5000 개의 행이있는 테이블이 있습니다. 이 값을 어느 방향 으로든 50 % 확률로 모든 기존 행에서 true 또는 false로 무작위로 지정하고 싶습니다. 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

나는 두 가지 방법을 생각할 수 있습니다

먼저 반드시 정확한 50 %의 분포를가 없습니다 random()

update mytable 
    set include_in_rct = random() > 0.5; 

이를 사용.

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 해당 테이블의 기본 키라고 가정 :

당신이 사용할 수있는 정확한 50/50 분포를 얻으려면.

그러나 첫 번째 것은 빠르지 만 5000 행만 중요합니다.

+0

번째 예는 임의의 행을 업데이트 할 것이다 제공하는 경우> 0.5' 작동한다, 그 때마다도 현재 상태 업데이트 행합니다. 그러나'row_number (over) (order by random()) '는 임의의 행을 50 % 분포로 업데이트 할 수 있습니다. (매우 효과적이지는 않지만 5000 행의 경우별로 중요하지 않습니다) . – pozs

+0

@pozs : 두 번째 명령문은 거짓 값과 참값의 50 % 분포로 행을 업데이트합니다.하지만 "임의"값은 아닙니다. –

0

항상 K.I.S.

select round(random()); 
관련 문제