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

时间:2018-03-02 01:06:49

标签: sql postgresql random

例如,如果我有一个名为companyId的列和我要保留的许多其他列,并且在companyId中我有100,101,102等的值,基本上是ID列表,每个Id显示不同的数字时间。如何根据companyId列随机抽样数据,以便根据每个Id的比例进行抽样?

例如:如果我有500行和100个companyA,100个companyB和300个companyC,我想从这个表中抽取100行。如何使我的数据有20个公司A,20个公司B和60个公司C?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您应该使用自SELECT documentation中描述的PostgreSQL 9.5以来可用的TABLESAMPLE子句。

有两种内置表格抽样方法SYSTEMBERNOULLI。两者都尝试获取随机样本,但SYSTEM方法选择表格块并使用其中的数据,而BERNOULLI使用整个表格中的随机样本。 SYSTEM速度更快,但BERNOULLI提供了更均匀分布的样本。

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

SELECT * FROM mytable TABLESAMPLE BERNOULLI (20);

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