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;
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手册
2条答案
按热度按时间xqk2d5yq1#
假设分布在一个表中:
这将枚举每个组的值。然后取适当的行数。注意:如果组不够大,则返回的行数将小于200k。
我手头没有teradata,我也不是100%确定
random()
允许进入row_number()
打电话。如果没有,可以使用其他类似的函数对每组的结果进行随机化。bweufnob2#
如果你想要快速而肮脏的东西,我想你可以用分层抽样法:
请记住,如果一个组中没有足够的行来满足所请求的样本大小,那么最终将得到比预期少的行,除非指定
WITH REPLACEMENT
条款。如果你想要一个“真实”的样本,你需要指定RANDOMIZED ALLOCATION
条款。td手册