在PostgreSQL中,如何根据分类列中每个级别的比例从表中随机抽样?

Key*_*ang 2 sql random postgresql

例如,如果我有一个名为 companyId 的列和我想保留的许多其他列,并且在 companyId 中我有 100、101、102 等值,基本上是一个 Id 列表,每个 Id 出现不同的次数。如何根据 companyId 列随机抽样数据,以便根据每个 Id 的比例?

例如:如果我有 500 行和 100 个 companyA、100 个 companyB 和 300 个 companyC,我想从这个表中采样 100 行。如何让我的数据有 20 个 companyA、20 个 companyB 和 60 个 companyC?

非常感谢。

Lau*_*lbe 8

您应该使用TABLESAMPLE自 PostgreSQL 9.5 起可用的子句,如SELECT文档中所述。

有两种内置的表采样方法SYSTEMBERNOULLI。两者都试图得到一个随机样本,但该SYSTEM方法选择表块并使用其中的数据,同时BERNOULLI使用整个表中的随机样本。SYSTEM速度更快,但BERNOULLI提供更均匀分布的样本。

您必须指定要获取的行的百分比。
如果你想要五分之一的桌子,你可以使用:

SELECT * FROM mytable TABLESAMPLE BERNOULLI (20);
Run Code Online (Sandbox Code Playgroud)

如果您的要求是获得一定数量的结果行,您可以考虑使用tsm_system_rows contrib 模块,该模块提供了SYSTEM_ROWS与 工作类似的表示例方法SYSTEM,但您可以指定结果行数。