我正在寻找在 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 中有没有其他可以替换的随机抽样方法?
我不得不说我确实知道这怎么可能,但我不知道如何在 Postgres 中实现它。这是我的想法:
如果我们不是生成一个随机值,而是生成样本大小为 的随机S
值S
,然后对所有随机生成的值进行排序,它将进行带放回抽样。(我不知道我是否正确。)
此时我不介意查询的性能。