2017-08-08 25 views
0

我見過幾個例子,但我不知道如何將我的查詢格式化爲一個聯合會,這個聯合會包含我的日內表。 TABLE_SUFFIX正在抓住我所有的日常餐桌,但我還需要抓住日內的smarttruck-6d137.com_usiinc_android_ANDROID.app_events_intraday_*。有人可以幫我使用UNION ALL格式嗎?謝謝。將UNION ALL與我的日內表結合起來

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 = 'division_id') AS Branch, 
    (
    SELECT 
    value.value.string_value 
    FROM 
    UNNEST(user_dim.user_properties) 
    WHERE 
    key = 'truck_id') AS Truck, 
    (
    SELECT 
    value.value.string_value 
    FROM 
    UNNEST(user_dim.user_properties) 
    WHERE 
    key = 'installer_id') AS Installer, 
    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 _TABLE_SUFFIX = Date 
GROUP BY 
    Date, 
    IMEI, 
    Branch, 
    Truck, 
    Installer 
ORDER BY 
    Date DESC, 
    Count DESC; 
+0

你需要區分結果中的兩個表嗎?還是把它們當作一張普通桌子就足夠了? –

+0

一張普通的桌子很好。 – Selch

回答

2

檢查,如果這對你的作品:

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 = 'division_id') AS Branch, 
    (
    SELECT 
    value.value.string_value 
    FROM 
    UNNEST(user_dim.user_properties) 
    WHERE 
    key = 'truck_id') AS Truck, 
    (
    SELECT 
    value.value.string_value 
    FROM 
    UNNEST(user_dim.user_properties) 
    WHERE 
    key = 'installer_id') AS Installer, 
    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 REGEXP_EXTRACT(_TABLE_SUFFIX, r'(\d+)') BETWEEN '20170807' and '20170809' 
GROUP BY 
    Date, 
    IMEI, 
    Branch, 
    Truck, 
    Installer 
ORDER BY 
    Date DESC, 
    Count DESC; 

你可以改變我在選擇使用什麼方式最適合你的日子。

如果您將在Data Studio中使用該查詢,那麼我傾向於根據今天的日期創建日期範圍,並根據時間返回多少天。例如:

AND REGEXP_EXTRACT(_TABLE_SUFFIX, r'(\d+)') BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)) and FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 0 DAY)) 

這會自動在過去30天內從今天開始計數。您可以根據您的數據工作室報告中最適合的查詢來調整此查詢。

+1

另一種選擇(而不是正則表達式)可以使用'SUBSTR(_TABLE_SUFFIX,LENGTH(_TABLE_SUFFIX) - 7)',但兩者都應該正常工作。 –

+0

@ElliottBrossard酷技術!將試一試以及 –

+0

@WillianFuks美麗。謝謝。 – Selch

0

我想我自己想通了。通過刪除where子句中的_TABLE_SUFFIX = Date,BQ也使用通配符來獲取我的日內表。我不會假裝我完全理解這是爲什麼會起作用,但它確實如此。如果你能解釋的話,請加入。

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 = 'division_id') AS Branch, 
    (
    SELECT 
    value.value.string_value 
    FROM 
    UNNEST(user_dim.user_properties) 
    WHERE 
    key = 'truck_id') AS Truck, 
    (
    SELECT 
    value.value.string_value 
    FROM 
    UNNEST(user_dim.user_properties) 
    WHERE 
    key = 'installer_id') AS Installer, 
    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) 
GROUP BY 
    Date, 
    IMEI, 
    Branch, 
    Truck, 
    Installer 
ORDER BY 
    Date DESC, 
    Count DESC; 
+0

只要確保沒有通過刪除範圍過濾條件來選擇整個數據集。檢查運行此查詢時將處理多少數據。 –

+2

這裏發生的事情是'*'匹配兩種後綴,例如'20170807'還有'intraday_20170807'。威爾的答案通過使用正則表達式來提取後綴的日期部分。 –

+0

謝謝你,我明白你要去的地方。但是,這不就是我的日期範圍硬編碼嗎?我將在Data Studio中使用它,所以我希望我的日期根據用戶輸入進行更改。 – Selch