例如,如果我有一个名为 companyId
的列和我想保留的许多其他列,并且在 companyId
中我有像 100
这样的值>, 101
, 102
, ..., 基本上是一个 ID 列表,每个 ID 出现的次数不同。如何根据 companyId
列随机抽取数据,使其符合每个 Id 的比例?
例如:如果我有 500 行和 100 个 companyA
、100 个 companyB
和 300 个 companyC
,并且我想从此表中抽取 100 行.如何使我的数据具有 20 个 companyA
、20 个 companyB
和 60 个 companyC
?
最佳答案
您应该使用自 PostgreSQL 9.5 以来可用的 TABLESAMPLE
子句,在 SELECT
documentation 中有描述。 .
有两种内置的表采样方法:SYSTEM
和BERNOULLI
。两者都尝试获取随机样本,但 SYSTEM
方法选择表 block 并使用其中的数据,而 BERNOULLI
使用整个表中的随机样本。 SYSTEM
速度更快,但 BERNOULLI
提供了更均匀分布的样本。
您必须指定要获取的行的百分比。
如果你想要你的 table 的五分之一,你会使用:
SELECT * FROM mytable TABLESAMPLE BERNOULLI (20);
如果您的要求是获得一定数量的结果行,您可以考虑使用 tsm_system_rows contrib 模块,它提供了SYSTEM_ROWS
表示例方法,其工作方式类似于SYSTEM
,但您可以指定结果行数。
关于sql - 在 PostgreSQL 中,如何根据分类列中每个级别的比例从表中随机抽样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49061229/