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

nz4*_*426 4 sql amazon-redshift

我需要从不同类别的客户中随机抽取样本。共有8个品类,订单分布在其中。

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

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

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

Gor*_*off 5

基本上,您将使用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;
Run Code Online (Sandbox Code Playgroud)

基本思想是可以通过对结果集按类别排序,对结果做第n个样本,得到分层样本。


Vee*_*jan 5

@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
Run Code Online (Sandbox Code Playgroud)