【问题标题】:postgres random using setseedpostgres 随机使用 setseed
【发布时间】:2014-03-13 16:38:52
【问题描述】:

我想使用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 的查询吗?

【问题讨论】:

    标签: postgresql random sample random-seed


    【解决方案1】:

    您必须以不同的方式使用setseedgenerate_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 的另一列,并在上面的查询中按此列排序。

    【讨论】:

    • 谢谢,我试了一下。但是,如果您使用相同的 setseed(0.5) 多次运行此查询,则 random_id 会发生变化。你知道如何防止这种情况,以便我能够复制样本吗?
    • 有一个应用程序服务来自多个用户的并发请求,当他们每个人都尝试设置他的个人种子并基于该种子执行选择时,两个选择查询都必须在事务中运行吗?隔离级别应该是多少?我们可以将两个选择合二为一吗?
    • @Kolyunya 我不知道。也许创建新问题并参考这个会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2017-02-11
    • 2021-01-26
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多