【问题标题】:SQL-How to sample my dataset based on condition - (TeraData db)SQL-如何根据条件对我的数据集进行采样 - (TeraData db)
【发布时间】:2020-10-27 13:59:57
【问题描述】:
我有一个包含 150 万客户的数据集。
我根据某些领域将客户分为 12 个不同的组,这些是分布:
我的任务是仅抽取 20 万客户的样本,但它必须具有此处显示的相同分布(基于分组百分比)。
有什么建议?我在 Teradata 数据库中使用 SQL。
**我在网上寻找了一些解决方案,但没有成功。 SAMPLE() 函数没有给我带来我需要的解决方案(或者我可能没有正确使用它)
谢谢!
【问题讨论】:
标签:
sql
random
bigdata
teradata
sample
【解决方案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() 调用中使用。如果没有,可以使用其他一些类似的函数来随机化每组的结果。
【解决方案2】:
如果您想要快速而肮脏的东西,我认为您可以使用分层抽样:
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 Manual