如何在 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 中做分层随机样本?的主要内容,如果未能解决你的问题,请参考以下文章