从 Google BigQuery 的不同列中查询键值
Query key value in different columns from Google BigQuery
我使用链接到 Google BigQuery 的 Firebase Analytics 收集分析。
我在 BigQuery 中有以下数据(不需要的 columns/rows 被删除,数据集看起来类似于 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 |
我要查询以下数据:
- 活动名称
- 用户编号
- 群组编号
我尝试了以下查询:
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
语句将 return 一个列表结果。 FIRST
函数只会在第一行的情况下给出正确的结果。
使用 standard SQL(取消选中 "Show Options" 下的 "Use Legacy 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;
我使用链接到 Google BigQuery 的 Firebase Analytics 收集分析。
我在 BigQuery 中有以下数据(不需要的 columns/rows 被删除,数据集看起来类似于 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 |
我要查询以下数据:
- 活动名称
- 用户编号
- 群组编号
我尝试了以下查询:
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
语句将 return 一个列表结果。 FIRST
函数只会在第一行的情况下给出正确的结果。
使用 standard SQL(取消选中 "Show Options" 下的 "Use Legacy 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;