如何在 BigQuery 中 select 多个自定义 Firebase 事件参数?
How to select multiple custom Firebase event parameters in BigQuery?
我将 Firebase 事件导出到 BigQuery,现在我正尝试 select 来自某个事件的两个参数。这是 selecting 一个参数的查询:
select event_dim.params.value.int_value as level_id
from [com_company_appname_ANDROID.app_events_20161210]
where event_dim.name = "level_replays_until_first_victory" and event_dim.params.key = "level_id"
两个参数都是整型值,第一个参数的名字是level_id
,第二个参数的名字是count
。我想要显示的是第一列中的 level_id
和第二列中的 count
。
下面将适用于 BigQuery Standard SQL
SELECT
(SELECT params.value.int_value FROM x.params
WHERE params.key = 'level_id') AS level_id,
(SELECT params.value.int_value FROM x.params
WHERE params.key = 'count') AS count
FROM `com_company_appname_ANDROID.app_events_20161210`, UNNEST(event_dim) AS x
WHERE x.name = 'level_replays_until_first_victory'
另请参阅 Migrating from legacy SQL,以防您受困于旧版 SQL
我喜欢之前的解决方案!这是我提出的同一问题的替代解决方案。我欢迎就哪种解决方案更 efficient/cheaper 以及原因发表评论。
SELECT event_param1.value.int_value AS level_id,
event_param2.value.int_value AS count
FROM `com_company_appname_ANDROID.app_events_20161210`,
UNNEST(event_dim) event,
UNNEST(event.params) as event_param1,
UNNEST(event.params) as event_param2
WHERE event.name = 'level_replays_until_first_victory'
AND event_param1.key = 'level_id'
AND event_param2.key = 'count'
另一个我觉得很方便的解决方案是使用 User Defined Functions to analyze user properties and event parameters
#Standard-SQL
#UDF for event parameters
CREATE TEMP FUNCTION paramValueByKey(k STRING, params ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, double_value FLOAT64 >>>) AS (
(SELECT x.value FROM UNNEST(params) x WHERE x.key=k)
);
#UDF for user properties
CREATE TEMP FUNCTION propertyValueByKey(k STRING, properties ARRAY<STRUCT<key STRING, value STRUCT<value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, double_value FLOAT64>, set_timestamp_usec INT64, index INT64 > >>) AS (
(SELECT x.value.value FROM UNNEST(properties) x WHERE x.key=k)
);
#Query the sample dataset, unnesting the events and turn 'api_version', 'round' and 'type_of_game' into columns
SELECT
user_dim.user_id,
event.name,
propertyValueByKey('api_version', user_dim.user_properties).string_value AS api_version,
paramValueByKey('round', event.params).int_value as round,
paramValueByKey('type_of_game', event.params).string_value as type_of_game
FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607`,
UNNEST(event_dim) as event
WHERE event.name = 'round_completed'
LIMIT 10;
第二个解决方案的更新
SELECT
event_param1.value.int_value AS level_id,
event_param2.value.int_value AS count
FROM
`com_company_appname_ANDROID.app_events_20161210`,
UNNEST(event_params) as event_param1,
UNNEST(event_params) as event_param2
WHERE event_name = 'level_replays_until_first_victory'
AND
event_param1.key = 'level_id'
AND
event_param2.key = 'count'
我将 Firebase 事件导出到 BigQuery,现在我正尝试 select 来自某个事件的两个参数。这是 selecting 一个参数的查询:
select event_dim.params.value.int_value as level_id
from [com_company_appname_ANDROID.app_events_20161210]
where event_dim.name = "level_replays_until_first_victory" and event_dim.params.key = "level_id"
两个参数都是整型值,第一个参数的名字是level_id
,第二个参数的名字是count
。我想要显示的是第一列中的 level_id
和第二列中的 count
。
下面将适用于 BigQuery Standard SQL
SELECT
(SELECT params.value.int_value FROM x.params
WHERE params.key = 'level_id') AS level_id,
(SELECT params.value.int_value FROM x.params
WHERE params.key = 'count') AS count
FROM `com_company_appname_ANDROID.app_events_20161210`, UNNEST(event_dim) AS x
WHERE x.name = 'level_replays_until_first_victory'
另请参阅 Migrating from legacy SQL,以防您受困于旧版 SQL
我喜欢之前的解决方案!这是我提出的同一问题的替代解决方案。我欢迎就哪种解决方案更 efficient/cheaper 以及原因发表评论。
SELECT event_param1.value.int_value AS level_id,
event_param2.value.int_value AS count
FROM `com_company_appname_ANDROID.app_events_20161210`,
UNNEST(event_dim) event,
UNNEST(event.params) as event_param1,
UNNEST(event.params) as event_param2
WHERE event.name = 'level_replays_until_first_victory'
AND event_param1.key = 'level_id'
AND event_param2.key = 'count'
另一个我觉得很方便的解决方案是使用 User Defined Functions to analyze user properties and event parameters
#Standard-SQL
#UDF for event parameters
CREATE TEMP FUNCTION paramValueByKey(k STRING, params ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, double_value FLOAT64 >>>) AS (
(SELECT x.value FROM UNNEST(params) x WHERE x.key=k)
);
#UDF for user properties
CREATE TEMP FUNCTION propertyValueByKey(k STRING, properties ARRAY<STRUCT<key STRING, value STRUCT<value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, double_value FLOAT64>, set_timestamp_usec INT64, index INT64 > >>) AS (
(SELECT x.value.value FROM UNNEST(properties) x WHERE x.key=k)
);
#Query the sample dataset, unnesting the events and turn 'api_version', 'round' and 'type_of_game' into columns
SELECT
user_dim.user_id,
event.name,
propertyValueByKey('api_version', user_dim.user_properties).string_value AS api_version,
paramValueByKey('round', event.params).int_value as round,
paramValueByKey('type_of_game', event.params).string_value as type_of_game
FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607`,
UNNEST(event_dim) as event
WHERE event.name = 'round_completed'
LIMIT 10;
第二个解决方案的更新
SELECT
event_param1.value.int_value AS level_id,
event_param2.value.int_value AS count
FROM
`com_company_appname_ANDROID.app_events_20161210`,
UNNEST(event_params) as event_param1,
UNNEST(event_params) as event_param2
WHERE event_name = 'level_replays_until_first_victory'
AND
event_param1.key = 'level_id'
AND
event_param2.key = 'count'