1

我从 PostgreSQL 中包含 50,000 行的表中生成了一个视图。我想根据许多条件从这个视图中随机抽取一个样本。我知道这可以通过以下方式完成:

select * from viewname
where columnname = 'A'  -- the condition
order by columnname 
limit 5;

但是,我想取满足此条件的行数的百分比,而不是“限制 5”。例如,'limit 5%'(尽管这不是正确的语法)。我知道可以使用 tablesample 子句完成类似的事情,但这不适用于视图。

4

2 回答 2

4

您可以使用窗口函数 PERCENT_RANK

SELECT *
FROM 
(
  select *, PERCENT_RANK() OVER (PARTITION BY columnname ORDER BY random()) AS pcrnk
  from tablename
  where columnname = 'A'
) q
WHERE pcrnk <= 0.05

如果你不想在结果中看到那个 pcrnk?

SELECT (t).*
FROM 
(
  select t, PERCENT_RANK() OVER (PARTITION BY columnname ORDER BY random()) AS pcrnk
  from tablename t
  where columnname = 'A'
) q
WHERE pcrnk <= 0.05 

在这里测试db<>fiddle

columnname = 'A' 如果有 100 个“A”和 1000 个“B”, 这些查询将根据标准 Fe 检索正常检索内容的 5% ,然后它们返回 5 条记录。

如果要返回表中所有记录的 5%?然后这是另一个技巧。

select *
from tablename
where columnname = 'A'
order by random()
limit 0.05 * (select count(*) from tablename)
于 2019-01-11T15:33:13.687 回答
2

为了随机选择您的行的百分比,如果您有 Postgres 9.5 或更高版本,请查看 Postgres TABLESAMPLE

它有两个选项:BERNOULLISYSTEM

BERNOULLI 和 SYSTEM 采样方法均接受一个参数,该参数是要采样的表的分数,表示为 0 到 100 之间的百分比。[...] 这两种方法均返回随机选择的表样本,该样本将包含大约指定百分比的表行。

SYSTEM更快,但BERNOULLI提供更好的随机分布,因为每条记录在被选中时具有相同的概率。

SELECT * 
FROM tablename TABLESAMPLE SYSTEM(5)
WHERE columnname = 'A'  -- the condition
ORDER BY columnname;

注意:这仅适用于查询表,而不适用于视图。

于 2019-01-11T15:39:43.660 回答