在PostgreSQL中,如何根据分类列中每个级别的比例从表中进行随机抽样?
在PostgreSQL中,有一个问题是如何根据分类列中每个级别的比例从表中进行随机抽样。解决这个问题的方法是使用自PostgreSQL 9.5版本起提供的TABLESAMPLE
子句。
TABLESAMPLE
子句提供了两种内置的表抽样方法:SYSTEM
和BERNOULLI
。这两种方法都试图获取一个随机抽样,但SYSTEM
方法选择表块并使用其中的数据,而BERNOULLI
方法使用整个表的随机抽样。尽管SYSTEM
方法更快,但BERNOULLI
方法提供了一个更均匀分布的抽样。
要获取指定比例的行数,需要指定所需的行数的百分比。例如,如果要获取表的五分之一,则可以使用以下语句:SELECT * FROM mytable TABLESAMPLE BERNOULLI (20);
如果要获取指定数量的结果行,可以考虑使用tsm_system_rows扩展模块,该模块提供了类似于SYSTEM
方法的SYSTEM_ROWS
表抽样方法,但可以指定结果行的数量。
但是,上述解决方法在问题中提到的情况下只能近似解决。假设这些数字仅用于说明,并且代表对表中的值出现频率的估计,而不是硬性要求。
总之,通过使用TABLESAMPLE
子句和适当的抽样方法,可以根据分类列中每个级别的比例从PostgreSQL表中进行随机抽样。