我从PostgreSQL的一个表中生成了一个视图,该表包含50,000行。我想根据多种条件从此视图中随机抽取一个样本。我了解这可以通过以下方式完成:
<script src="//cdn.ckeditor.com/4.6.2/standard/ckeditor.js"></script>
但是,我要取符合条件的行数的百分比,而不是“限制5”。因此,例如,“限制5%”(尽管这不是正确的语法)。我了解可以使用tablesample子句完成类似的操作,但这不适用于视图。
答案 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。
它有两个选项:BERNOULLI
和SYSTEM
:
BERNOULLI和SYSTEM采样方法每个都接受一个参数,该参数是要采样的表的分数,用0到100之间的百分比表示。[...]这两种方法都返回随机选择的包含大约指定行百分比的表。
SYSTEM
速度更快,但是BERNOULLI
可以提供更好的随机分布,因为每个记录的选择概率都相同。
SELECT *
FROM tablename TABLESAMPLE SYSTEM(5)
WHERE columnname = 'A' -- the condition
ORDER BY columnname;
NB:仅在查询表时有效,而对视图则无效。