【问题标题】: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

      【讨论】:

        猜你喜欢
        • 2021-12-26
        • 1970-01-01
        • 2015-01-31
        • 2019-11-27
        • 1970-01-01
        • 2017-05-20
        • 2018-10-29
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多