sql如何基于条件对数据集进行采样-(teradata db)

f0ofjuux  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(368)

我有150万客户的数据集。我根据一些字段将客户分为12个不同的组,这是分布:

我的任务是只抽取20万个客户的样本,但它必须具有此处显示的相同分布(基于分组百分比)。有什么建议吗?我在teradata数据库中使用sql。

**我在网上寻找一些解决办法,但没有成功。sample()函数没有为我提供所需的解决方案(或者可能我没有正确使用它),谢谢!

xqk2d5yq

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 d
where seqnum <= c.grp * d.percent * 200000;

这将枚举每个组的值。然后取适当的行数。注意:如果组不够大,则返回的行数将小于200k。
我手头没有teradata,我也不是100%确定 random() 允许进入 row_number() 打电话。如果没有,可以使用其他类似的函数对每组的结果进行随机化。

bweufnob

bweufnob2#

如果你想要快速而肮脏的东西,我想你可以用分层抽样法:

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手册

相关问题