SQL-如何根据条件对我的数据集进行采样-(TeraData db)

时间:2020-07-07 10:22:27

标签: sql random bigdata teradata sample

我有一个150万客户的数据集。 我根据某个领域将客户分为12个不同的组,这就是分布:

enter image description here

我的任务是仅抽样200,000个客户,但必须具有此处显示的相同分布(基于分组百分比)。 有什么建议?我在Teradata数据库中使用SQL。

**我在网上寻找了一些解决方案,但没有成功。 SAMPLE()函数没有给我带来所需的解决方案(或者我没有正确使用它) 谢谢!

2 个答案:

答案 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子句。

TD Manual