2017-04-23 129 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