我正在尝试使用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
答案 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数组。 一个结果表行等于源表中的一个会话/行