使用 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 技术