2017-08-08 46 views
0

我將從我是新手的事實開始,並設法一起破解這個原始查詢。我已經瀏覽了很多例子,但我只是沒有把自己的頭圍繞自我連接,並顯示我想看到的數據。瞭解自我加入並展開

我每天都在向BQ提供移動應用程序數據,因此我正在查詢多個表格。我試圖通過日期查詢IMEI發生致命事故的計數。這個查詢確實給了我大部分我想要的輸出,因爲它返回Date,IMEI和Count。

但是,我想輸出爲日期,IMEI,分支,卡車和計數。 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,分支,卡車和計數在一行中。

感謝您的幫助。

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; 

一對夫婦的想法/建議,雖然:

  • 要限制你有多少數據掃描,你可能想過濾_TABLE_SUFFIX = '20170807'而不是event_dim.date = '20170807'。這將會更便宜,並且(如果我理解正確)將返回相同的結果。
  • 如果IMEI,branch_id和truck_id的組合是唯一的,則計算計數可能沒有好處,因此您可以刪除COUNT(*)GROUP BY/ORDER BY子句。
+0

這很好,謝謝。至於日期,我在Data Studio中使用這個結果可能會跨越一天或多天,這就是我查詢多個表的原因。如果有更好的辦法,我全都是耳朵。 – Selch

+0

你可以做的是在選擇列表中包含'_TABLE_SUFFIX AS date'而不是'event_dim.date'。如果您從Data Studio過濾日期,它將限制掃描的日期。如果這個答案解決了你的問題,請[接受/ upvote](https://stackoverflow.com/help/someone-answers)。謝謝! –

+0

你的幫助一直很好,謝謝。最終,我想查詢今天的盤中表以及最近30天的結果。我已經按照你的建議加入了_TABLE_SUFFIX,但是我怎樣才能得到盤中表呢? – Selch