我正在寻找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是样本大小,然后对所有随机生成的值进行排序,它将是替换样本。(我不知道我是否正确)
在这一点上,我不介意查询的性能。
答案 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;