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

8 浏览
0 Comments

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

举个例子,假设我有一个名为companyId的列,还有其他很多我想要保留的列。在companyId列中,我有像100101102等值,基本上是一个Id的列表,每个Id出现的次数不同。我如何根据companyId列的比例随机抽取数据呢?

例如:如果我有500行数据,其中有100个companyA,100个companyB和300个companyC,我想从这个表中抽取100行数据。我如何使得我的数据中有20个companyA,20个companyB和60个companyC

0
0 Comments

在PostgreSQL中,有一个问题是如何根据分类列中每个级别的比例从表中进行随机抽样。解决这个问题的方法是使用自PostgreSQL 9.5版本起提供的TABLESAMPLE子句。

TABLESAMPLE子句提供了两种内置的表抽样方法:SYSTEMBERNOULLI。这两种方法都试图获取一个随机抽样,但SYSTEM方法选择表块并使用其中的数据,而BERNOULLI方法使用整个表的随机抽样。尽管SYSTEM方法更快,但BERNOULLI方法提供了一个更均匀分布的抽样。

要获取指定比例的行数,需要指定所需的行数的百分比。例如,如果要获取表的五分之一,则可以使用以下语句:SELECT * FROM mytable TABLESAMPLE BERNOULLI (20);

如果要获取指定数量的结果行,可以考虑使用tsm_system_rows扩展模块,该模块提供了类似于SYSTEM方法的SYSTEM_ROWS表抽样方法,但可以指定结果行的数量。

但是,上述解决方法在问题中提到的情况下只能近似解决。假设这些数字仅用于说明,并且代表对表中的值出现频率的估计,而不是硬性要求。

总之,通过使用TABLESAMPLE子句和适当的抽样方法,可以根据分类列中每个级别的比例从PostgreSQL表中进行随机抽样。

0