我有150万客户的数据集。我根据一些字段将客户分为12个不同的组,这是分布:我的任务是只抽取20万个客户的样本,但它必须具有此处显示的相同分布(基于分组百分比)。有什么建议吗?我在teradata数据库中使用sql。
**我在网上寻找一些解决办法,但没有成功。sample()函数没有为我提供所需的解决方案(或者可能我没有正确使用它),谢谢!
xqk2d5yq1#
假设分布在一个表中:
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 dwhere seqnum <= c.grp * d.percent * 200000;
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() 打电话。如果没有,可以使用其他类似的函数对每组的结果进行随机化。
random()
row_number()
bweufnob2#
如果你想要快速而肮脏的东西,我想你可以用分层抽样法:
SELECT *FROM mytable tSAMPLE 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
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 条款。td手册
WITH REPLACEMENT
RANDOMIZED ALLOCATION
2条答案
按热度按时间xqk2d5yq1#
假设分布在一个表中:
这将枚举每个组的值。然后取适当的行数。注意:如果组不够大,则返回的行数将小于200k。
我手头没有teradata,我也不是100%确定
random()
允许进入row_number()
打电话。如果没有,可以使用其他类似的函数对每组的结果进行随机化。bweufnob2#
如果你想要快速而肮脏的东西,我想你可以用分层抽样法:
请记住,如果一个组中没有足够的行来满足所请求的样本大小,那么最终将得到比预期少的行,除非指定
WITH REPLACEMENT
条款。如果你想要一个“真实”的样本,你需要指定RANDOMIZED ALLOCATION
条款。td手册