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

标签 sql postgresql random

例如,如果我有一个名为 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 中有描述。 .

有两种内置的表采样方法:SYSTEMBERNOULLI。两者都尝试获取随机样本,但 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/

上一篇:sql - 键不在表中

下一篇:sql - 统一元组

相关文章:

mysql - 使用 CASE 将值与用户 ID 对齐

sql - 导出 Azure SQL 数据库时出现错误 SQL71501

mysql - 在 SQl 中加入名称

python - 为特定地区/国家生成随机坐标的轻量级工具?

java - 如何在 Java Spark 中生成随机 RDD

mysql - 在mysql中随机选择10行

mysql - 将行转置为列 (MySQL)

postgresql - Spark 和分片 JDBC 数据源

来自 postgresql 数据库的 Python 格式日期字符串

java - 我可以在 JPA 中使用 @Query 的嵌套查询吗?