【问题标题】:How does sampling random n% records work using RAND() in big query?在大查询中如何使用 RAND() 对随机 n% 记录进行采样?
【发布时间】:2020-04-23 14:00:08
【问题描述】:

我想获得帮助以了解 bigquery 中的 sql 查询。

如果我编写如下查询,这会从总行数中随机抽取 1% 行,其中列 DEP_DELAY 不是 null。没有RAND(),总行数为235208

SELECT COUNT(DEP_DELAY) FROM flights.fedtzcorr WHERE RAND() < 0.1

阅读document,它说它会在小数点后创建十五位精度。所以,从字面上理解,我认为 RAND() 创建 15 位数字 在0100,000,000,000,000 之间...

此函数生成小数点后精度为 15 位的 Decimal 类型的值。

RAND() 如何从总行数中抽取 1% 的行?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    请注意,您指向的文档是与 Dataprep 相关的文档,而不是 BigQuery:

    正确的文档是:

    在 [0, 1) 范围内生成 FLOAT64 类型的伪随机值,包括 0 和不包括 1。

    所以RAND() 生成一个介于 0 和 1 之间的数字。WHERE RAND() &lt; 0.1 然后匹配 10% 的行(不是 1%)。对于 1% 的用户,请尝试 WHERE RAND() &lt; 0.01

    更多示例请参见https://stackoverflow.com/a/23376403/132438

    【讨论】:

      【解决方案2】:

      所以查询可能如下:

      DECLARE deep_delay_count INT64;
      DECLARE deep_delay_pct FLOAT64;
      
      SET deep_delay_count = (SELECT COUNT(DISTINCT DEP_DELAY)
                              FROM flights.fedtzcorr
                              WHERE DEP_DELAY IS NOT NULL);
      SET deep_delay_pct = IF(deep_delay_count IS NOT NULL, 0.01 * deep_delay_count / deep_delay_count, 0);
      
      SELECT DISTINCT DEP_DELAY
      FROM flights.fedtzcorr
      WHERE DEP_DELAY IS NOT NULL
        AND RAND() < deep_delay_pct;
      

      【讨论】:

        猜你喜欢
        • 2015-09-02
        • 2011-12-19
        • 1970-01-01
        • 2020-06-04
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        相关资源
        最近更新 更多