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

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

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

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

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

【问题讨论】:

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

标签: sql amazon-redshift


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2013-01-28
      • 2019-09-20
      • 1970-01-01
      相关资源
      最近更新 更多