2017-04-23 93 views
1

我正在使用大查詢,並試圖導入自定義尺寸以及非自定義尺寸。分析是從應用程序發送的,基本上我需要一個包含列的表:用戶ID(自定義維度),平臺ID(自定義維度),屏幕名稱(基本上是「網頁名稱」的應用程序版本)和日期。度量標準是將所有這些維度分組的「屏幕瀏覽次數」。這是它看起來象下面這樣:谷歌自定義尺寸BigQuery

的GA報告的照片:

enter image description here

所以,在BigQuery中,我能拿到簽出(與上述GA報表時),直到我的數字添加到自定義維度中。一旦我添加了自定義尺寸,這些數字就沒有任何意義了。

我知道自定義維度嵌套在大查詢中。所以我首先確保使用FLATTEN。然後,我嘗試沒有變平,並得到相同的結果。這些數字沒有意義(比GA界面大幾百倍)。

我的查詢在下面(一個沒有FLATTEN,另一個沒有FLATTEN)。

PS我非常想用的

count(hits) 

代替

count(hits.appInfo.screenName) 

但我一直得到一個錯誤,當我在子查詢中選擇命中。

我的查詢沒有拼合在下面。如果你能幫助我弄清楚,爲什麼是它,一旦我添加自定義維度的所有數據被搞砸

SELECT 
    date, 
    hits.appInfo.version, 
    hits.appInfo.screenName, 
    UserIdd, 
    platform, 
count(hits.appInfo.screenName) 


FROM (
      SELECT 
      date, 
      hits.appInfo.version, 
      hits.appInfo.screenName, 
      max(case when hits.customdimensions.index = 5 then hits.customdimensions.value end) within record as UserIdd, 

      max(case when hits.customdimensions.index = 20 then hits.customdimensions.value end) within record as platform 



      FROM 
      TABLE_DATE_RANGE([fiery-cabinet-97820:87025718.ga_sessions_], TIMESTAMP('2017-04-04'), TIMESTAMP('2017-04-04')) 

      ) 

    where UserIdd is not null 
    and platform = 'Android' 

GROUP BY 
    1, 
    2, 
    3, 
    4, 
    5 
ORDER BY 
    6 DESC 

,這裏是我的查詢與FLATTEN(同樣的問題 - 數字不有道理)

SELECT 
date, 
hits.appInfo.version, 
    customDimensions.index, 
    customDimensions.value, 
    hits.appInfo.screenName, 
    UserIdd, 
count(hits.appInfo.screenName) 

FROM (FLATTEN((FLATTEN((
      SELECT 
      date, 
      hits.appInfo.version, 
      customDimensions.value, 
      customDimensions.index, 
      hits.appInfo.screenName, 
      max(case when hits.customdimensions.index = 5 then hits.customdimensions.value end) within record as UserIdd, 
      hits.type 

      FROM 
      TABLE_DATE_RANGE([fiery-cabinet-97820:87025718.ga_sessions_], TIMESTAMP('2017-04-04'), TIMESTAMP('2017-04-04'))), customDimensions.value)),hits.type)) 

WHERE 
    customDimensions.value = 'Android' 
    and customDimensions.index = 20 
    and UserIdd is not null 


GROUP BY 
    1, 
    2, 
    3, 
    4, 
    5, 
    6 
ORDER BY 
    7 DESC 
+0

爲什麼在這個問題上有'mysql'標籤? –

回答

4

我不確定hits.customDimensions.*將始終具有用戶範圍的維度(並且我猜你的userId指標是用戶範圍的)。

具體而言,應該從customDimensions查詢用戶範圍的維度,而不是hits.customDimensions

從概念上講,第一步是使customDimensionshits.*兼容,通過展平或範圍聚合。我會解釋扁平化方法。

GA記錄的形狀爲(customDimensions[], hits[], ...),這對查詢這兩個字段都沒有好處。我們首先將這些扁平化爲(customDimensionN, hits[], ...)

上一級,通過選擇hits.*下的字段,我們將表格隱式地變爲(customDimensionN, hitN)記錄。我們對這些進行過濾以僅包含匹配(customDimension5, appviewN)的記錄。

最後一步是計算一切。

SELECT date, v, sn, uid, COUNT(*) 
FROM (
    SELECT 
     date, 
     hits.appInfo.version v, 
     hits.appInfo.screenName sn, 
     customDimensions.value uid 
    FROM 
     FLATTEN((
      SELECT customDimensions.*, hits.*, date 
      FROM 
      TABLE_DATE_RANGE(
       [fiery-cabinet-97820:87025718.ga_sessions_], 
       TIMESTAMP('2017-04-04'), 
       TIMESTAMP('2017-04-04'))), 
     customDimensions) 
WHERE hits.type = "APPVIEW" and customDimensions.index = 5) 
GROUP BY 1,2,3,4 
ORDER BY 5 DESC 

下面是另一種等效方法。這使用了我在GA BQ食譜中推薦的範圍化聚合技巧。查看查詢說明,但是,MAX(IF(...)) WITHIN RECORD似乎相當昂貴,在第一階段觸發了額外的COMPUTEAGGREGATE階段。不過,獎勵積分更容易消化。

SELECT sn, uid, date, v, COUNT(*) 
FROM (
    SELECT 
     MAX(IF(customDimensions.index = 5, customDimensions.value, null)) within record as uid, 
     hits.appInfo.screenname as sn, 
     date, 
     hits.appInfo.version as v, 
     hits.type 
    FROM 
     TABLE_DATE_RANGE([fiery-cabinet-97820:87025718.ga_sessions_], TIMESTAMP('2017-04-04'), TIMESTAMP('2017-04-04'))) 
WHERE hits.type = "APPVIEW" and uid is not null 
GROUP BY 1,2,3,4 
ORDER BY 5 DESC 

我還不熟悉BQ的標準SQL方言,但它似乎會簡化這種爭吵。如果你會做出這樣的許多查詢,你可能想要圍繞這個問題進行討論。

+0

我很想看看這是如何在標準SQL方言中完成的。 – fraxture