Google BigQuery-使用WITH和RAND()的错误

Rup*_*ssl 5 sql google-bigquery google-cloud-platform

当我在WITH中使用RAND()时,我遇到了一个有趣的行为:

WITH
  t0 AS ( SELECT rand() AS c ),
  t1 AS ( SELECT c FROM t0 ),
  t2 AS ( SELECT c FROM t0 )

SELECT c FROM t1
   UNION ALL 
SELECT c FROM t2

-- 
-- returns:
-- 1    0.229810680294245    
-- 2    0.5750437237982657
-- instead of:
-- 1    0.229810680294245    
-- 2    0.229810680294245    
-- 
Run Code Online (Sandbox Code Playgroud)

当我这样做时,甚至会发生相同的事情:

WITH
  t0 AS ( SELECT rand() AS c )

SELECT c FROM t0
   UNION ALL 
SELECT c FROM t0
Run Code Online (Sandbox Code Playgroud)

有什么线索为什么会发生?

Fel*_*ffa 1

将 Elliott Brossard 的回复作为对已删除答案的评论显示:

RAND()在WITH子句中使用时应该只运行一次。WITH 子句与宏类似——它们内联到查询计划中——这是一个已知的错误,因为在不同的任务上运行时,RAND() 将使用不同的种子进行评估,但修复有点复杂。