验证BigQuery中的第一个嵌套页面行是否包含自定义维度值

时间:2017-11-29 18:54:31

标签: sql google-analytics google-bigquery

我正在尝试使用StandardSQL在Big Query中编写SQL查询来计算我的Google Analytics数据。我还在学习BigQuery的工作并适应复杂性。

我希望在我的GA表中迭代每个会话一段时间,并确定“PAGE”类型的FIRST命中。在该命中,我想返回特定自定义维度的值。自定义维度是会话范围的,但我只想知道此特定匹配的值。

我想我需要通过会话进行分区并尝试如下,但我对第二次嵌套感到困惑

SELECT (SELECT value from hits.customDimension where hits.customDimension.index == 13) OVER(fullVisitorID) FROM
      `ga_sessions_2017*` AS t
    WHERE
      _TABLE_SUFFIX BETWEEN '0901'
      AND '0930'
      AND totals.hits > 2) 
      AND row_number() = 1
      AND hit.type = "PAGE"
GROUP BY 1

我使用UDF尝试过以下操作,但我知道我写的内容效率很低。

#standardSQL
CREATE TEMP FUNCTION
  isDefined(json_str STRING)
  RETURNS STRING
  LANGUAGE js AS """
var row = JSON.parse(json_str);
var defined  = "no";

for(i=0; i < row.length; i++) {
if(row[i].type != "PAGE") continue;
row[i].customDimensions.forEach(function(cd) {
if(cd.index == "13" || cd.index == 13) {
if(cd.value !== null || cd.value !== "") defined  = "yes";
}
});
return defined;
}


""";
SELECT becomesDefined, count(*) FROM (
SELECT
  isDefined(TO_JSON_STRING(t.hits)) as becomesDefined
FROM
  `ga_sessions_2017*` AS t
WHERE
  _TABLE_SUFFIX BETWEEN '0901'
  AND '0930'
  AND totals.hits > 2) GROUP BY 1

1 个答案:

答案 0 :(得分:1)

如果自定义维度是会话作用域,则整行只有一个值,因为一行等于一个会话。 此查询获取命中范围的第一个命中cd13值,就像您从会话级别指定+自定义维度值(也是13,但您可以轻松更改)。您可以对所有内容使用子选择:

SELECT
  (SELECT cd.value 
   FROM  t.hits h,  h.customDimensions cd 
   WHERE type='PAGE' AND cd.index=13
   ORDER BY hitnumber ASC
   LIMIT 1) AS firstHitCd13,

  (SELECT value
   FROM UNNEST(t.customDimensions)
   WHERE index=13) AS sessionLevelCd13

FROM
  `project.dataset.ga_sessions_201712*` t
LIMIT
  1000

第一个子选择使用自定义维度数组的交叉连接。第二个只是取消了customDimensions数组。 一个结果表行等于源表中的一个会话/行