2017-08-08 8 views
0

私は初心者だということから始めて、この元のクエリを一緒にハックすることに成功しました。私は多くの例を見てきましたが、私は自分の周りに自分の頭をラップしたり、見たいデータを表示したりしていません。セルフ・ジョインとフラットニングの理解

毎日モバイルアプリのデータをBQに入力しているため、複数の表を照会しています。 IMEIによる日付による致命的なクラッシュ数を照会しようとしています。このクエリは、Date、IMEI、Countを返すので、私が必要とする出力の大部分を与えてくれます。

しかし、出力をDate、IMEI、Branch、Truck、Countにしたいとします。 user_dim.user_properties.keyはネストされたフィールドです。私のクエリでは、特にuser_dim.user_properties.key = 'imei_id'を求め、user_dim.user_properties.value.value.string_valueの値を取得しています。

私は、user_dim.user_properties.key = 'truck_id'とuser_dim.user_properties.key = 'branch_id'の値を取得するために結合をどのように実行するのか分かりません。最終的に出力が次のようになります。Date 、IMEI、支店、トラック、カウントが1行に表示されます。

ありがとうございました。ここで

SELECT 
    event_dim.date AS Date, 
    user_dim.user_properties.value.value.string_value AS IMEI, 
COUNT(*) AS Count 
FROM 
    FLATTEN((
    SELECT 
     * 
    FROM 
    TABLE_QUERY([smarttruck-6d137:com_usiinc_android_ANDROID],'table_id CONTAINS "app_events_"')), user_dim.user_properties) 
WHERE 
    user_dim.user_properties.key = 'imei_id' 
    AND event_dim.name = 'app_exception' 
    AND event_dim.params.key = 'fatal' 
    AND event_dim.params.value.int_value = 1 
    AND event_dim.date = '20170807' 
GROUP BY 
    Date, 
    IMEI 
ORDER BY 
    Count DESC 
+1

レガシSQLの使用を開始しないでください。私は代わりに[標準SQL](https://cloud.google.com/bigquery/docs/reference/standard-sql/)の学習をお勧めします。 –

答えて

1

standard SQLを使用して、あなたのために働く必要があるクエリです:

#standardSQL 
SELECT 
    event_dim.date AS Date, 
    (SELECT value.value.string_value 
    FROM UNNEST(user_dim.user_properties) 
    WHERE key = 'imei_id') AS IMEI, 
    (SELECT value.value.string_value 
    FROM UNNEST(user_dim.user_properties) 
    WHERE key = 'branch_id') AS branch_id, 
    (SELECT value.value.string_value 
    FROM UNNEST(user_dim.user_properties) 
    WHERE key = 'truck_id') AS truck_id, 
    COUNT(*) AS Count 
FROM `smarttruck-6d137.com_usiinc_android_ANDROID.app_events_*` 
CROSS JOIN UNNEST(event_dim) AS event_dim 
WHERE 
    event_dim.name = 'app_exception' AND 
    EXISTS (
    SELECT 1 FROM UNNEST(event_dim.params) 
    WHERE key = 'fatal' AND value.int_value = 1 
) AND 
    event_dim.date = '20170807' 
GROUP BY 
    Date, 
    IMEI, 
    branch_id, 
    truck_id 
ORDER BY 
    Count DESC; 

思考/提案のカップルは、しかし:

  • あなたはスキャンするデータ量を制限するには、 event_dim.date = '20170807'の代わりに_TABLE_SUFFIX = '20170807'にフィルタすることをお勧めします。これは安くなり、(私が正しく理解すれば)同じ結果を返すでしょう。
  • IMEI、branch_id、およびtruck_idの組み合わせが一意である場合、カウントの計算にはメリットがない可能性があるため、COUNT(*)GROUP BY/ORDER BY句を削除できます。
+0

これは素晴らしいです、ありがとうございます。日付に関しては、私はData Studioでこの結果を使用しています。これは1日以上にわたって複数のテーブルを照会しているためです。もっと良い方法があれば、私はすべて耳です。 – Selch

+0

あなたができることは 'event_dim.date'の代わりに' _TABLE_SUFFIX AS date'を選択リストに含めることです。 Data Studioから 'date'をフィルタリングすると、スキャンされる日数が制限されます。この回答があなたの問題を解決した場合は、[accept/upvote it](https://stackoverflow.com/help/someone-answers)をクリックしてください。ありがとう! –

+0

あなたのお手伝いがよかったです、ありがとうございます。最終的に今日の日中のテーブルだけでなく、過去30日間の1つの結果を照会したいと思います。私は提案したように_TABLE_SUFFIXを組み込みましたが、どのようにしてintradayテーブルも取り込むことができますか? – Selch

関連する問題