web-dev-qa-db-ja.com

BigQueryで複数のカスタムFirebaseイベントパラメータを選択するにはどうすればよいですか?

FirebaseイベントをBigQueryにエクスポートしましたが、特定のイベントから2つのパラメーターを選択しようとしています。 1つのパラメータを選択するためのクエリは次のとおりです。

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"

両方のパラメーターはint値であり、最初のパラメーターの名前はlevel_idであり、2番目のパラメーターはcountです。私が示したいのは、最初の列にlevel_id、2番目の列にcountです。

10
Luka Maške

以下は 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'

参照 レガシーSQLからの移行 レガシーSQLで立ち往生している場合

13

私は前の解決策が大好きです!これが私が思いついた同じ問題の代替解決策です。どのソリューションがより効率的/安価であるか、そしてその理由についてのコメントを歓迎します。

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'
8
MSquare

私が非常に便利だと思うもう1つの解決策は、 ユーザー定義関数を使用してユーザープロパティとイベントパラメーターを分析する を使用することです。

#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;
1
nDakota