0

我正在查看我们网站上一位访问者的特定操作,只是为了了解如何收集一些数据以及如何提取我需要的数据。基本上,当访问者看到我们网站的某些部分并且我想看看是否正在收集这些数据时,就会触发特定的促销活动。

我运行了以下代码来识别访问者看到的页面以及他们的会话触发的事件:

select fullvisitorid, visitid, date, hitnumber, type, page.pagepath, 
eventinfo.eventcategory, eventinfo.eventlabel, eventinfo.eventaction
from `big-query-156009.xxxxxx.ga_sessions_*` t, t.hits as hits
where _table_suffix between "20170511" and "20170511"
and fullvisitorid = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
and visitid = xxxxxxxxx
order by hitnumber

这工作得很好,我可以看到访客的旅程。我也想拉

hits.promotion.promoid, 
hits.promotion.promoname, 
hits.promotion.promocreative, 
hits.promotion.promoposition, 
hits.promotionactioninfo.promoisview,
hits.promotionactioninfo.promoisclick

我已经使用以下代码进行了尝试:

select fullvisitorid, 
visitid, 
date, 
hitnumber, 
type, 
page.pagepath, 
eventinfo.eventcategory, 
eventinfo.eventlabel, 
eventinfo.eventaction, 
promotion.promoId, 
promotion.promoname, 
promotion.promocreative, 
promotion.promoposition,
promotionactioninfo.promoIsView,
promotionactioninfo.promoIsclick
from `big-query-156009.xxxxxx.ga_sessions_*` t, t.hits as hits,
hits.promotion as promotion
where _table_suffix between "20170511" and "20170511"
and fullvisitorid = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
and visitid = xxxxxxxxx
order by hitnumber

但是,当我这样做时,将完全一样的 fullvisitorid、visitorid、日期和数据集等我没有得到任何结果。没有错误或任何东西只是没有结果。

我不完全理解嵌套,所以我假设我只是缺少一些简单的东西。

有什么办法可以在一个查询中提取所有这些数据,还是我需要进行子查询?

谢谢

4

2 回答 2

3

通过在表、t.hits和之间使用逗号(连接)运算符hits.promotion,您可以获取数组元素的叉积。在这种情况下发生的情况是,因为其中一个数组是空的(可能是hits.promotion),所以你得到一个空的结果,因为1 * <number of hits> * 0 = 0. 即使其中一个数组为空,也要获得一行,请改用左连接,例如:

from `big-query-156009.xxxxxx.ga_sessions_*` t
LEFT JOIN UNNEST(t.hits) as hits
LEFT JOIN UNNEST(hits.promotion) as promotion
where ...
于 2017-05-18T11:39:33.373 回答
0

另一种可以帮助您进行此类分析的技术运行如下:

SELECT
    fullvisitorid fv,
    visitid v,
    ARRAY(SELECT AS STRUCT hits.hitnumber, hits.type, page.pagepath, eventinfo.eventcategory, promotion FROM UNNEST(hits) hits ORDER BY hitnumber) hits
FROM `big-query-156009.xxxxxx.ga_sessions_*`
WHERE
1 = 1
AND EXISTS(SELECT 1 FROM UNNEST(hits) hits WHERE ARRAY_LENGTH(hits.promotion) > 0)

请注意,该UNNESTING过程现在仅发生在行级别,而不是作为 CROSS-JOIN。

您还可以使用 WHERE 子句过滤掉您想要的内容(在这种情况下,我删除了所有没有关联任何促销 ID 的行。例如,您还可以根据需要仅过滤掉某些事件类别标签) .

于 2017-05-18T15:26:53.720 回答