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

Posted

技术标签:

【中文标题】如何在 Redshift 中做分层随机样本?【英文标题】:How to do a stratified random sample in Redshift? 【发布时间】:2019-01-11 21:31:39 【问题描述】:

我需要对从不同类别购买的客户进行随机抽样。有8个类别,订单分布在其中。

如果我想对已购买的客户进行随机抽样,但保持每个类别的订单比例相同,我将如何在我的 sql 代码中进行设置?

下面是一个突出显示的表格(它不包括客户数据 - 我希望我的客户列表基于订单的代表性比例):

我正在使用的表可以在这里找到:https://imgur.com/a/Q0lMHWf

【问题讨论】:

Postgres 或 Redshift。尽管它们有着相同的根源,但它们却截然不同。 Postgre sql 在 Reshift 上运行! 我刚遇到这个,因为我有同样的问题。最后能搞清楚吗? 【参考方案1】:

基本上,您将使用row_number()order by,并选择第 n 个值。因此,对于大约 1% 的分层样本,请执行以下操作:

select t.*
from (select t.*,
             row_number() over (order by category, rand()) as seqnum
      from t
     ) t
where mod(seqnum, 101) = 1
order by category;

基本思想是,你可以通过按类别对结果集进行排序并对结果进行第 n 个样本来获得分层样本。

【讨论】:

嘿 Gordon,你的意思是我为每个类别运行该查询吗? 不确定你的意思戈登。任何澄清将不胜感激。 @nz426 。 . .不,这是获取分层样本的愚蠢方法。此查询获得大约 1% 的分层样本。 @GordonLinoff 101 而不是 100 的原因是什么?另外,谢谢您的回答。【参考方案2】:

@Dnoeth 解决方案有效且易于使用。但是,请将 rand() 更改为 random()。 AWS redshift 的随机函数名称为“random”。请参考https://docs.aws.amazon.com/redshift/latest/dg/r_RANDOM.html。 'random() 对我有用,但对 rand() 无效

select *

from
(
 select t.*
  ,percent_rank()
   over (partition by category
         order by random()) as pr
from tab
) as dt 
where pr <= 0.1 -- similar to 10% sample

【讨论】:

【参考方案3】:

在随机订单上尝试PERCENT_RANK 以获得 n% 的订单样本:

select *
from
 (
   select t.*
      ,percent_rank()
       over (partition by category
             order by rand()) as pr
   from tab
 ) as dt
where pr <= 0.1 -- similar to 10% sample

【讨论】:

以上是关于如何在 Redshift 中做分层随机样本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Redshift 中批量更新设置值?

SPSS可以做分层区组随机化的随机分组表吗

分层随机样本以匹配 BigQuery 中的不同表

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

分层区组随机化及R语言实现(blockrand包)

数据帧的分层随机抽样