【问题标题】:In PostgreSQL, How do I random sample from table based on the proportion of each level in a categorical column?在 PostgreSQL 中,如何根据分类列中每个级别的比例从表中随机抽样?
【发布时间】:2018-08-10 04:51:16
【问题描述】:

例如,如果我有一个名为 companyId 的列和许多其他我想保留的列,并且在 companyId 中我有 100、101、102 等值,基本上是一个 Id 列表,每个 Id 出现不同的数字次。如何根据companyId列随机抽取数据,使其按照每个Id的比例?

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

非常感谢。

【问题讨论】:

标签: sql postgresql random


【解决方案1】:

您应该使用自 PostgreSQL 9.5 起可用的 TABLESAMPLE 子句,如 SELECT documentation 中所述。

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

您必须指定要获取的行的百分比。
如果你想要五分之一的桌子,你会使用:

SELECT * FROM mytable TABLESAMPLE BERNOULLI (20);

如果您的要求是获得一定数量的结果行,您可以考虑使用tsm_system_rows contrib 模块,它提供了类似于SYSTEMSYSTEM_ROWS 表示例方法,但您可以指定数量结果行数。

【讨论】:

  • 这能回答问题吗? OP 想知道如何对“20 companyA, 20 companyB and 60 companyC”进行采样?
  • 你是对的,这是一个近似值。我假设这些数字仅用于说明,代表估计而非硬性要求(请注意,这些数字与表中值出现的频率成正比)。
  • 感谢您的说明,它确实有助于理解 tablesample 的工作原理。
猜你喜欢
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 2023-04-11
  • 2018-07-06
  • 2021-01-20
  • 1970-01-01
相关资源
最近更新 更多