从Postgresql中的视图中选择一个随机样本

时间:2019-01-11 15:23:43

标签: sql postgresql

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

<script src="//cdn.ckeditor.com/4.6.2/standard/ckeditor.js"></script>

但是,我要取符合条件的行数的百分比,而不是“限制5”。因此,例如,“限制5%”(尽管这不是正确的语法)。我了解可以使用tablesample子句完成类似的操作,但这不适用于视图。

2 个答案:

答案 0 :(得分: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 <>小提琴here

上进行测试

这些查询将根据条件columnname = 'A'检索正常检索值的5%。 F.e.如果有100个“ A”和1000个“ B”,则它们返回5条记录。

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

select *
from tablename
where columnname = 'A'
order by random()
limit 0.05 * (select count(*) from tablename)

答案 1 :(得分:1)

为了随机选择行的百分比,如果您的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;

NB:仅在查询表时有效,而对视图则无效。