PostgreSQL中的采样

时间:2015-03-30 15:35:02

标签: postgresql random replace sampling

我正在寻找PostgreSQL中随机抽样的可能方法。我找到了几种方法来做到这一点,具有不同的优点和缺点。这种天真的方式是:

select * from Table_Name
order by random()
limit 10;

另一种更快的方法是:

select * from Table_Name
WHERE random() <= 0.01
order by random()
limit 10;

(虽然0.01取决于表格大小和样本大小;这只是一个例子。)

在这两个查询中,为每一行生成一个随机数,并根据随机生成的数字进行排序。然后在排序的数字中,前10个被选为最终结果,所以我认为这些应该是无需替换的采样。

现在我想做的是以某种方式将这种采样方法变为采样替换。怎么可能?或者在PostgreSQL中是否还有其他随机抽样方法?

我不得不说我确实知道如何实现这一点但我不知道如何在postgresql中实现它,这是我的想法:
如果不生成一个随机值,我们生成S个随机值,其中S是样本大小,然后对所有随机生成的值进行排序,它将是替换样本。(我不知道我是否正确)
在这一点上,我不介意查询的性能。

1 个答案:

答案 0 :(得分:0)

这可以通过将随机值映射到行号来实现。如果碰巧相同的相应随机数出现N次,则可以对同一行进行N次采样。这是CTE实施:

with 
 rows as (select *,row_number() over() as rn from tablename order by random()),
 w(num) as (select (random()*(select count(*) from rows))::int+1
              from generate_series(1,10)) 
select rows.* from rows join w on rows.rn = w.num;