2016-11-03 3 views
1

私はGoogle BigQueryにリンクしたFirebase Analyticsで分析を集めました。Google BigQueryと異なる列のキー値を照会

私は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
  • グループ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 

上記のクエリに問題がWITHIN修飾子とSELECT文が結果のリストを返しますので、集約関数FIRSTが間違った結果を与えるということです。 FIRST関数は、最初の行の場合にのみ正しい結果を返します。 (「表示オプション」の下の「使用レガシーSQLを」オフ)standard SQLを使用して

答えて

4

あなたが行うことができます:

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; 
+0

これは完全に機能しているようです。データはプレビューとは異なる順序で表示されますが、大きな問題ではありません。 このクエリに複数のテーブルを(同じスキーマを使用して)追加することができますか? – Timon

+1

もちろん、[ワイルドカードテーブル](https://cloud.google.com/bigquery/docs/wildcard-tables)に興味があるかもしれませんし、 'FROM MyTable'の代わりに' FROM(SELECT * FROM MyTable) UNION ALL SELECT *からMyOtherTable UNION ALL ...) 'を呼び出します。 [移行ガイド](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#comma_o​​perator_with_tables)には、「UNION ALL」の例もいくつかあります。 –

+0

ああ、私はワイルドカードテーブルについて読んでいただけです。それは素晴らしい機能です!どうもありがとう! – Timon

関連する問題