You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于BigQuery中CTE复用RAND()返回不同随机数的疑问

BigQuery中CTE复用RAND()返回不同随机数的疑问

嘿,这个问题我太有共鸣了!刚接触BigQuery的时候我也踩过一模一样的坑,咱们来拆解清楚为什么会这样:

首先得明确BigQuery里CTE的本质——它并不是一个“存储结果的临时表”,而是一个可重复引用的查询逻辑片段。当你写with t as (SELECT RAND())时,BigQuery并不会预先计算出RAND()的结果并保存下来,而是每次你引用这个CTE(也就是两次SELECT * FROM t)的时候,都会重新执行一遍CTE里的查询语句。

RAND()本身是一个非确定性函数,每次调用都会生成新的随机数,所以两次执行SELECT RAND()自然会得到不同的结果,这就是你看到两个不同数字的原因。

那如果想要复用同一个随机数,给你两个实用的方案:

  • 用临时表存储结果
    临时表会实实在在把计算后的随机数存储下来,后续查询都是读取已有的结果,不会重新计算:

    CREATE TEMP TABLE t AS SELECT RAND() AS rand_val;
    SELECT * FROM t 
    UNION ALL 
    SELECT * FROM t;
    
  • 用聚合函数固定CTE里的随机值
    聚合函数(比如MAX()、MIN())会让BigQuery先计算出RAND()的结果并固定,后续引用CTE时就不会重新执行RAND()了:

    WITH t AS (SELECT MAX(RAND()) AS rand_val) 
    SELECT * FROM t 
    UNION ALL 
    SELECT * FROM t;
    

回到你做随机分组的场景,更稳妥的方式是先给每个待分组的对象生成一个唯一的随机值(只生成一次),然后基于这个值来划分处理组和对照组,这样就能保证分组的随机性和一致性啦~

备注:内容来源于stack exchange,提问作者Christopher Junk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:09:31