在 GBQ 的子句中生成稳定的 uuid ID

Generating a stable uuid ID across with clauses in GBQ

我正在尝试在 GBQ 的 with 子句中生成 UUID,然后在后续的 with 子句中使用它进行连接。

with q1 as (
    select generate_uuid() as uuid 
), q2 as (
    select uuid from q1
)
select * from q1 
union all 
select * from q2

这returns两个不同的uuid。

我将如何生成一个在子句中保持相同的 ID?

因为子查询总是在每次调用时执行,所以对于您的查询,generate_uuid 将被 q1 和 q2 tables 调用两次。 我建议您将生成的 UUID 保存到 table,然后从中查询以确保 UUID 与 tables.

相同

我将从这种差异背后的原因开始。

TLDR;截至目前,没有选项可以强制 BigQuery 实现 CTE 结果。当 CTE 在语句中多次引用时,它会很有用。

查看以下查询:

with cte_1 as (
  select count(1) as row_count
  from `bigquery-public-data.austin_311.311_service_requests` as sr
)
, cte_2 as (
  select row_count
  from cte_1
)
select row_count
from cte_1
union all
select row_count
from cte_2;

检查执行计划时,您会看到 2 Input 阶段引用 sr table.

如果我们可以选择实现 CTE 结果,那就太好了。 我记得,如果 CTE 多次使用或通过提示显式使用,oracle 会隐式地使用它。

q1 显式实现为 table 然后使用它两次可能是一种解决方法。我更喜欢 temporary table。 缺点是;如果您的项目使用按需定价,成本可能会增加。 (而不是固定费率)