Sql 如何在红移中进行分层随机抽样?

Sql 如何在红移中进行分层随机抽样?,sql,amazon-redshift,Sql,Amazon Redshift,我需要对从不同类别购买的客户进行随机抽样。共有8类,订单分布在其中 如果我想随机抽取购买过产品的客户样本,但每个类别的订单比例保持不变,我将如何在我的sql代码中进行设置 下面有一个表格突出显示了这一点,它不包括客户数据-我希望我的客户列表以具有代表性的订单比例为基础: 我正在使用的表可以在这里找到:基本上,您可以使用行号、排序方式,并选择第n个值。因此,对于大约1%的分层样本,请执行以下操作: select t.* from (select t.*, row_numb

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

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

下面有一个表格突出显示了这一点,它不包括客户数据-我希望我的客户列表以具有代表性的订单比例为基础:

我正在使用的表可以在这里找到:

基本上,您可以使用行号、排序方式,并选择第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次采样来获得分层样本。

尝试按随机顺序进行百分比排序,以获得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

@Dnoeth溶液有效且易于使用。但是,请将rand改为random。AWS redshift的随机函数名为“随机”。请参考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

Postgres或Redshift。虽然它们有着相同的根,但它们是完全不同的!我只是遇到了这个问题,因为我有同样的问题。最后能找到答案吗?嘿,戈登,你的意思是我对每个类别都进行了查询吗?不确定戈登是什么意思。如有任何澄清,将不胜感激。@nz426。不,那将是一个愚蠢的获得分层样本的方法。此查询得到大约1%的分层样本。