如何在Redshift中进行分层随机抽样?

时间:2019-01-11 21:31:39

标签: sql amazon-redshift

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

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

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

我正在使用的

表可以在这里找到:https://imgur.com/a/Q0lMHWf

3 个答案:

答案 0 :(得分: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个样本来获得分层样本。

答案 1 :(得分:1)

@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

答案 2 :(得分:0)

尝试对随机订单执行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