为什么在 BigQuery 中取消嵌套两个或多个变量时没有得到任何结果?

Why when unnesting two or more variables in BigQuery do I get no results?

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

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

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、visitid、日期和数据集等我没有得到任何结果。没有错误或没有任何结果。

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

是否有任何方法可以在一个查询中提取所有这些数据,或者我是否需要执行子查询?

谢谢

通过在 table、t.hitshits.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 ...

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

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 进程现在仅在行级别发生,而不是作为交叉连接发生。

您还可以使用 WHERE 子句来过滤出您想要的内容(在这种情况下,我删除了所有没有关联任何促销 ID 的行。例如,您也可以仅过滤出某些 eventcategorieslabels 如果需要的话)。