2017-07-03 58 views
0

我們正在嘗試使用腳本作爲Doug Mackenzie創建的谷歌BigQuery鏈接:http://online-behavior.com/analytics/funnel-analysis
我們遇到了一些SQL調用問題。Funnel傳統SQL過濾器問題 - BigQuery

我們試圖使用hits.customDimensions.index = 20中的值爲1的過濾器。這些值總是存在,因此一個簡單的過濾器(例如在他的介紹中用作示例的過濾器)不幸是不夠的。 過濾器如:
WHERE hits.customDimensions.index = '20'不過濾我們需要過濾的內容。
相反,我們需要(我們想象)是這樣的:

WHERE MAX(IF(hits.customDimensions.index=20,hits.customDimensions.value,NULL)) WITHIN hits as locked= '1'

這就是我們試着做它:

FROM (
    SELECT 
     fullVisitorId, 
     visitId, 
     MIN(hits.hitNumber) AS firstHit, 
     MAX(IF(hits.isExit, 1, 0)) AS exit 
    FROM(
     SELECT 
     *, 
     MAX(IF(hits.customDimensions.index=20,hits.customDimensions.value,NULL)) WITHIN hits as locked, 
     FROM 
     TABLE_DATE_RANGE([[dataset.ga_sessions_], TIMESTAMP('2017-06-01'), TIMESTAMP('2017-06-04')) 
    ) 
    WHERE 
     REGEXP_MATCH(hits.page.pagePath, '^/plus/.*/[0-9]') 
     AND totals.visits = 1 
     AND locked= '1' 
    GROUP BY 
     fullVisitorId, 
     visitId) s0 

這將返回錯誤:
錯誤:無法查詢重複字段customDimensions.index和hits.kunde的叉積。 ;無法查詢重複字段customDimensions.value和hits.kunde的叉積。

我們已經看到有一些建議在上述錯誤的問題上使用FLATTEN。然而,這似乎給語法錯誤:

FROM (
    SELECT 
     fullVisitorId, 
     visitId, 
     MIN(hits.hitNumber) AS firstHit, 
     MAX(IF(hits.isExit, 1, 0)) AS exit, 
     MAX(IF(hits.customDimensions.index=20,hits.customDimensions.value,NULL)) WITHIN hits AS locked 
    FROM 
     FLATTEN(TABLE_DATE_RANGE([[dataset.ga_sessions_], TIMESTAMP('2017-06-01'), TIMESTAMP('2017-06-04')),hits.customDimension) 
    WHERE 
     REGEXP_MATCH(hits.page.pagePath, '^/plus/.*/[0-9]') 
     AND totals.visits = 1 
     AND locked = '1' 
    GROUP BY 
     fullVisitorId, 
     visitId) s0 

只是給出了錯誤:Error: Not found: Table eb-bigquery:3917183.ga_sessions_
那麼我們如何才能得到過濾器的工作有任何建議,將不勝感激。

+1

想知道,是否有沒有使用BQ的[Standard](https://cloud.google.com/bigquery/docs/reference/standard-sql/)版本的原因? –

+0

我們正在使用的腳本生成的SQL調用在Legacy中執行。 – Sofu5

回答

2

自從寫這篇博客以來,BigQuery已經發展了很多,現在我們有了更先進的技術來處理數據。

這就是爲什麼我問你是否可以使用標準版本的BigQuery來解決這個問題的主要原因。例如:

SELECT 
    fullvisitorid, 
    visitid, 
    (select min(hitNumber) from unnest(hits) where regexp_contains(page.pagePath, r'^/plus/.*/[0-9]')) firstHit, 
    (select max(isExit) from UNNEST(hits) where regexp_contains(page.pagePath, r'^/plus/.*/[0-9]')) exitFlag 
FROM `table` 
WHERE 1 = 1 
    AND EXISTS(select 1 from unnest(hits) where regexp_contains(page.pagePath, r'^/plus/.*/[0-9]')) 
AND EXISTS(select 1 from unnest(hits) hits where (select count(value) from unnest(hits.customDimensions) custd where index=20) > 0) 
AND totals.visits = 1 

這個查詢做同樣的事情,比傳統的人運行速度更快,因爲它避免了第一unnesting所有重複字段,然後處理數據。

+0

感謝這似乎適用於我在此處發佈的示例。 – Sofu5

+0

Follyow問題,因爲這應該是google-bigquery的漏斗。我們想要查看多個頁面路徑,然後我們希望將這些值添加並計數。在這裏我們已經嘗試了對每個頁面路徑使用'full outer join each'。然而,在這裏我們收到兩個錯誤:'錯誤:UNNEST表達式引用既沒有在[x:y]分組也沒有被聚合的列命中,並且'SELECT'應該在括號內。任何建議 - 我可以完全發佈爲一個新問題。 – Sofu5

+0

@ Sofu5剛纔我看到您的評論。看起來你已經問過這個問題,雖然:) –