如何在 Redshift 中仅输出随机 xx% 的查询输出记录?

Posted

技术标签:

【中文标题】如何在 Redshift 中仅输出随机 xx% 的查询输出记录?【英文标题】:How to output only random xx% of query output records in Redshift? 【发布时间】:2020-02-18 20:22:04 【问题描述】:

当您不知道返回的记录数时,有没有办法只输出 Redshift 中输出记录总数的百分比?

假设查询的输出将是 1000 条记录。您只想随机选择其中的 60%...所以在这种情况下将是 600 条记录。

如果我知道输出总是1000,那么我会使用LIMIT 600。但是我不知道会返回多少条记录,我希望它是可变的..

有什么想法吗?

PS: 尝试使用 LIMIT (0.6*COUNT(*)) 但没有用。错误是“LIMIT 不带变量”

【问题讨论】:

【参考方案1】:

如果您不需要 准确 条记录但大约 60%,那么我建议:

where random() <= 0.6

如果您确实需要一个确切的数字,那么:

select t.*
from (select t.*,
             row_number() over (order by random()) as seqnum,
             count(*) over () as cnt
      from t
     ) t
where seqnum <= 0.6 * cnt;

【讨论】:

您的意思是只将上面的 where random() 添加到查询中吗? (是的,我需要返回记录总数的百分比,而不是确切的数字) @ZelelB 。 . .然后使用第一个版本。它应该比尝试对数据进行排序更快。 不知何故我不明白其中的区别......你都使用 0.6(所以 60%) 确切的数字在哪里?你能提供一个例子吗?对不起,速度很慢:D where random() &lt;= 0.6 将为每一行生成一个随机数。假设随机数是均匀分布的,则该语句将在 60% 的时间内评估为TRUE。同样,如果您只想要 10 个随机行,您可以使用 ORDER BY RANDOM() LIMIT 10

以上是关于如何在 Redshift 中仅输出随机 xx% 的查询输出记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Redshift 中做分层随机样本?

如何在 nvidia/cuda 基础 docker 中仅安装 nvcc?

从数据库中提取数据时如何在 GridView 中仅显示日期? C#

如何在输出中仅显示数组元素

Redshift Querying: error xx000 disk full redshift

时间戳未从 Glue 加载到 Redshift 表中