我有一个150万客户的数据集。 我根据某个领域将客户分为12个不同的组,这就是分布:
我的任务是仅抽样200,000个客户,但必须具有此处显示的相同分布(基于分组百分比)。 有什么建议?我在Teradata数据库中使用SQL。
**我在网上寻找了一些解决方案,但没有成功。 SAMPLE()函数没有给我带来所需的解决方案(或者我没有正确使用它) 谢谢!
答案 0 :(得分:1)
假设分布在表格中:
select c.*
from (select c.*,
row_number() over (partition by grp order by random()) as seqnum,
count(*) over (partition by grp) as grp
from customers c
) c
distribution d
where seqnum <= c.grp * d.percent * 200000;
这枚举每个组的值。然后取适当数量的行。注意:如果组不够大,则返回的行数将少于200k。
我手头没有Teradata,并且我不确定100%保证random()
通话中允许使用row_number()
。如果没有,则可以使用其他一些相似的函数将每组的结果随机化。
答案 1 :(得分:0)
如果您想要快速又脏的东西,我想您可以使用分层采样来做到:
SELECT *
FROM mytable t
SAMPLE
WHEN group = 0 THEN (.40 * 200000)
WHEN group = 1 THEN (.17 * 200000)
WHEN group = 2 THEN (.11 * 200000)
WHEN group = 3 THEN (.04 * 200000)
WHEN group = 4 THEN (.06 * 200000)
WHEN group = 5 THEN (.01 * 200000)
WHEN group = 6 THEN (.05 * 200000)
WHEN group = 7 THEN (.05 * 200000)
WHEN group = 8 THEN (.02 * 200000)
WHEN group = 9 THEN (.03 * 200000)
WHEN group = 10 THEN (.04 * 200000)
WHEN group = 11 THEN (.02 * 200000)
END
请记住,如果组中没有足够的行来满足请求的样本大小,那么除非指定WITH REPLACEMENT
子句,否则最终的行数会少于预期。而且,如果您想要“真实”的示例,则需要指定RANDOMIZED ALLOCATION
子句。