0

我正在尝试使用legacySQL进行查询以检索两个事件表的联合,因为数据工作室尚不支持标准SQL。

在standardSQL中,这将是这样的:

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_"'))

但不确定这是否是正确的方法,我得到:

不能同时输出多个独立重复的字段。找到 user_dim_user_properties_value_index 和 event_dim_date

编辑:最后这是查询的结果,因为您不能直接将 FLATTEN 与 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)
4

3 回答 3

3

正如您所猜测的那样,表通配符在旧版 SQL 中不起作用,因此您必须使用该TABLE_QUERY()函数。

您的方法是正确的,但 TABLE_QUERY 函数中的第一个参数应该是数据集名称而不是名称的第一部分。假设您的数据集名称是 app_events,如下所示:

TABLE_QUERY(app_events,'table_id CONTAINS "app_events"')
于 2017-02-17T13:48:57.163 回答
2

在 legacySQL 中,联合表运算符是comma

select * from [table1],[table2]

对于 TABLE_QUERY,您将包含数据集名称作为第一个参数,以及第二个参数的表达式

select * from (TABLE_QUERY([dataset], 'table_id CONTAINS "event"'))

阅读更多如何调试 TABLE_QUERY 阅读这个链接的答案

Web UI 会自动将结果展平,但是当存在独立的重复字段时,您需要使用 FLATTEN 包装器进行展平。

它需要两个参数、表格和重复字段,例如:FLATTEN(table, tags)

此外,如果涉及 TABLE_QUERY,您可能需要进行子选择

select
  *
from
  FLATTEN((SELECT * FROM TABLE_QUERY(com_myapp_ANDROID, 'table_id CONTAINS "app_events"')),user_dim.user_properties)
于 2017-02-17T13:46:20.350 回答
1

您遇到的特定问题与 UNION 无关 - 如果表有多个独立重复的字段并且您尝试一次输出它们,即使只有一个表,您也会看到相同的错误消息。这种情况是旧版 SQL 特有的,可以使用FLATTEN 子句
来解决。 同时,很可能您实际上并不打算使用SELECT *导致那些重复字段同时输出的方法。如果你可以缩小你的输出列表——你有很小的机会解决它——但是如果输出中仍然很少有独立重复的字段——你可以使用 FLATTEN 技术

于 2017-02-17T15:57:11.050 回答