postgres随机使用setseed

时间:2014-03-13 16:38:53

标签: postgresql random sample random-seed

我想使用setseed向表中添加一个带有随机数的列。

原始表格结构(test_input) col_a,col_b,col_c

所需的输出(test_output) col_a, col_b, col_c, random_id

以下内容在所有行上返回相同的random_id,而不是在每行中返回不同的值。

select col_a,col_b,col_c,setseed(0.5),(
     select random() from generate_series(1,100) limit 1
     ) as random_id 
from test_input

您能帮我修改使用setseed的查询并在每行中返回不同的random_id吗?

1 个答案:

答案 0 :(得分:5)

您必须以不同方式使用setseed。在您的示例中,generate_series()也被误导了。你需要使用类似的东西:

select setseed(0.5);

select col_a,col_b,col_c, random() as random_id from test_input;

如果要获得分配给同一行的相同随机数,则必须先排序行,引用documentation

  

如果指定了ORDER BY子句,则返回的行将进行排序   指定的订单。如果未给出ORDER BY,则返回行   以任何顺序,系统发现最快生产。

您可以使用:

select setseed(0.5);

select *, random() as random_id from (        
select col_a,col_b,col_c from test_input order by col_a, col_b, col_c) a;

这里我假设col_a, col_b, col_c的组合是唯一的。如果不是这种情况,则必须首先向表中添加具有唯一ID的另一列,并在上面的查询中按此列进行排序。