我需要对从不同类别购买的客户进行随机抽样。有8个类别,订单分布在其中。
如果我想对已购买产品的客户进行随机抽样,但每个类别的订单比例保持不变,我该如何在sql代码中进行设置?
下面的表格突出显示了该表格(不包括客户数据-我希望我的客户列表基于订单的代表比例):
我正在使用的表可以在这里找到:https://imgur.com/a/Q0lMHWf
答案 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