gpt4 book ai didi

postgresql - 在 PostgreSQL 中采样

转载 作者:行者123 更新时间:2023-11-29 13:57:19 26 4
gpt4 key购买 nike

我正在寻找 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 是样本大小,然后对所有随机生成的值进行排序,这将是有放回的采样。(我不知道我是否正确)
此时我不介意查询的性能。

最佳答案

这可以通过将随机值映射到行号来实现。如果恰好对应的同一个随机数出现 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;

关于postgresql - 在 PostgreSQL 中采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29350311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com