在 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。
缺点是;如果您的项目使用按需定价,成本可能会增加。 (而不是固定费率)
我正在尝试在 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。
缺点是;如果您的项目使用按需定价,成本可能会增加。 (而不是固定费率)