【问题标题】:Query key value in different columns from Google BigQuery从 Google BigQuery 查询不同列中的键值
【发布时间】:2017-03-17 07:41:06
【问题描述】:

我使用链接到 Google BigQuery 的 Firebase Analytics 收集分析数据。

我在 BigQuery 中有以下数据(省略了不必要的列/行,数据集类似于 https://bigquery.cloud.google.com/table/firebase-analytics-sample-data:ios_dataset.app_events_20160607?tab=preview):

| event_dim.name | event_dim.params.key | event_dim.params.value.string_value |
|----------------|----------------------|-------------------------------------|
| read_post      | post_id              | p_100                               |
|                | group_id             | g_1                                 |
|                | user_id              | u_1                                 |
| open_group     | post_id              | p_200                               |
|                | group_id             | g_2                                 |
|                | user_id              | u_1                                 |
| open_group     | post_id              | p_300                               |
|                | group_id             | g_1                                 |
|                | user_id              | u_3                                 |

我要查询以下数据:

  • 事件名称
  • 用户名
  • 组 ID

我尝试了以下查询:

SELECT
  event_dim.name,
  FIRST(IF(event_dim.params.key = "user_id", event_dim.params.value.string_value, NULL)) WITHIN RECORD user_id,
  FIRST(IF(event_dim.params.key = "group_id", event_dim.params.value.string_value, NULL)) WITHIN RECORD group_id
FROM
  [xxx:xxx_IOS.app_events_20161102]
LIMIT
  1000

上述查询的问题在于聚合函数FIRST 会给出错误的结果,因为带有WITHIN 修饰符的SELECT 语句将返回结果列表。 FIRST 函数只会在第一行的情况下给出正确的结果。

【问题讨论】:

    标签: google-bigquery firebase-analytics


    【解决方案1】:

    使用standard SQL(取消选中“显示选项”下的“使用旧版 SQL”)您可以:

    SELECT
      event_dim.name,
      (SELECT value.string_value FROM UNNEST(params)
       WHERE key = 'user_id') AS user_id,
      (SELECT value.string_value FROM UNNEST(params)
       WHERE key = 'group_id') AS group_id
    FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160607`,
      UNNEST(event_dim) AS event_dim
    LIMIT 1000;
    

    如果您只想要同时具有 'user_id''group_id' 的行,则可以过滤掉 NULL 值:

    SELECT * FROM (
      SELECT
        event_dim.name,
        (SELECT value.string_value FROM UNNEST(params)
         WHERE key = 'user_id') AS user_id,
        (SELECT value.string_value FROM UNNEST(params)
         WHERE key = 'group_id') AS group_id
      FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160607`,
        UNNEST(event_dim) AS event_dim
    )
    WHERE user_id IS NOT NULL AND group_id IS NOT NULL
    LIMIT 1000;
    

    【讨论】:

    • 好的,这似乎工作得很好!数据的显示顺序与预览不同,但这没什么大不了的。您是否知道我如何向该查询添加多个表(具有相同架构)?
    • 当然,您可能对wildcard tables 感兴趣,或者您可以使用FROM (SELECT * FROM MyTable UNION ALL SELECT * FROM MyOtherTable UNION ALL ...) 代替FROM MyTablemigration guide 也有几个 UNION ALL 的例子。
    • 哈,我只是在阅读通配符表。这是一个很棒的功能!非常感谢!
    • 谢谢你,我正忙着把我的专栏弄出来。真的有帮助!
    猜你喜欢
    • 2018-07-29
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多