使用 bigquery LegacySQL 的表 UNION
UNION of tables using bigquery LegacySQL
我正在尝试使用 legacySQL 进行查询以检索并集两个事件表,但不幸的是,data studio 尚不支持标准 SQL。
在标准 SQL 中类似于:
SELECT
*
FROM
`com_myapp_ANDROID.app_events_*`,
`com_myapp_IOS.app_events_*`
但是,在 legacySQL 中,我在尝试引用 app_events_* 时遇到错误。如何包含我的事件的所有表,以便在我不能使用通配符的情况下在数据工作室之后过滤它?
我试过类似的方法:
select * from (TABLE_QUERY(com_myapp_ANDROID, 'table_id CONTAINS "app_events_"'))
但不确定这是否是正确的方法,我得到:
Cannot output multiple independently repeated fields at the same time.
Found user_dim_user_properties_value_index and event_dim_date
编辑:最后这是查询的结果,因为您不能直接使用 FLATTEN with TABLE_QUERY:
select
*
from
FLATTEN((SELECT * FROM TABLE_QUERY(com_myapp_ANDROID, 'table_id CONTAINS "app_events"')),user_dim.user_properties),
FLATTEN((SELECT * FROM TABLE_QUERY(com_myapp_IOS, 'table_id CONTAINS "app_events"')),user_dim.user_properties)
在 legacySQL 中,联合 table 运算符是 comma
select * from [table1],[table2]
对于 TABLE_QUERY,您可以将数据集名称作为第一个参数,将表达式作为第二个参数
select * from (TABLE_QUERY([dataset], 'table_id CONTAINS "event"'))
阅读更多如何调试 TABLE_QUERY 阅读此 linked answer
Web UI 会自动将结果展平,但是当存在独立的重复字段时,您需要使用 FLATTEN 包装器展平。
它有两个参数,table,和重复字段,例如:FLATTEN(table, tags)
此外,如果涉及 TABLE_QUERY,您可能需要像
这样的子选择
select
*
from
FLATTEN((SELECT * FROM TABLE_QUERY(com_myapp_ANDROID, 'table_id CONTAINS "app_events"')),user_dim.user_properties)
Table 通配符在遗留 SQL 中不起作用,正如您所猜测的那样,您必须使用 TABLE_QUERY()
函数。
您的方法是正确的,但是 TABLE_QUERY 函数中的第一个参数应该是 数据集 名称而不是 [=24 的第一部分=] 姓名。假设您的数据集名称是 app_events,它看起来像这样:
TABLE_QUERY(app_events,'table_id CONTAINS "app_events"')
您遇到的特定问题与 UNION 无关 - 如果 table 有多个独立重复的字段并且您尝试输出它们,即使只有一个 table,您也会看到相同的错误消息立刻。此场景特定于旧版 SQL,可以使用 FLATTEN clause
解决
同时,很可能您实际上并不打算使用 SELECT *
,这会导致那些重复的字段同时输出。如果您可以缩小输出列表的范围 - 您有很小的机会解决它 - 但如果输出中仍然很少有独立重复的字段 - 您可以使用 FLATTEN 技术
我正在尝试使用 legacySQL 进行查询以检索并集两个事件表,但不幸的是,data studio 尚不支持标准 SQL。
在标准 SQL 中类似于:
SELECT
*
FROM
`com_myapp_ANDROID.app_events_*`,
`com_myapp_IOS.app_events_*`
但是,在 legacySQL 中,我在尝试引用 app_events_* 时遇到错误。如何包含我的事件的所有表,以便在我不能使用通配符的情况下在数据工作室之后过滤它?
我试过类似的方法:
select * from (TABLE_QUERY(com_myapp_ANDROID, 'table_id CONTAINS "app_events_"'))
但不确定这是否是正确的方法,我得到:
Cannot output multiple independently repeated fields at the same time. Found user_dim_user_properties_value_index and event_dim_date
编辑:最后这是查询的结果,因为您不能直接使用 FLATTEN with TABLE_QUERY:
select
*
from
FLATTEN((SELECT * FROM TABLE_QUERY(com_myapp_ANDROID, 'table_id CONTAINS "app_events"')),user_dim.user_properties),
FLATTEN((SELECT * FROM TABLE_QUERY(com_myapp_IOS, 'table_id CONTAINS "app_events"')),user_dim.user_properties)
在 legacySQL 中,联合 table 运算符是 comma
select * from [table1],[table2]
对于 TABLE_QUERY,您可以将数据集名称作为第一个参数,将表达式作为第二个参数
select * from (TABLE_QUERY([dataset], 'table_id CONTAINS "event"'))
阅读更多如何调试 TABLE_QUERY 阅读此 linked answer
Web UI 会自动将结果展平,但是当存在独立的重复字段时,您需要使用 FLATTEN 包装器展平。
它有两个参数,table,和重复字段,例如:FLATTEN(table, tags)
此外,如果涉及 TABLE_QUERY,您可能需要像
这样的子选择select
*
from
FLATTEN((SELECT * FROM TABLE_QUERY(com_myapp_ANDROID, 'table_id CONTAINS "app_events"')),user_dim.user_properties)
Table 通配符在遗留 SQL 中不起作用,正如您所猜测的那样,您必须使用 TABLE_QUERY()
函数。
您的方法是正确的,但是 TABLE_QUERY 函数中的第一个参数应该是 数据集 名称而不是 [=24 的第一部分=] 姓名。假设您的数据集名称是 app_events,它看起来像这样:
TABLE_QUERY(app_events,'table_id CONTAINS "app_events"')
您遇到的特定问题与 UNION 无关 - 如果 table 有多个独立重复的字段并且您尝试输出它们,即使只有一个 table,您也会看到相同的错误消息立刻。此场景特定于旧版 SQL,可以使用 FLATTEN clause
解决
同时,很可能您实际上并不打算使用 SELECT *
,这会导致那些重复的字段同时输出。如果您可以缩小输出列表的范围 - 您有很小的机会解决它 - 但如果输出中仍然很少有独立重复的字段 - 您可以使用 FLATTEN 技术