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

时间:2017-05-18 11:00:43

标签: sql google-bigquery unnest standard-sql

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

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

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

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

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

谢谢

2 个答案:

答案 0 :(得分:2)

通过在表t.hitshits.promotion之间使用逗号(join)运算符,您将获取数组元素的叉积。在这种情况下发生的是因为其中一个数组是空的(可能是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 ...

答案 1 :(得分:0)

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

docker run --log-driver=gelf --log-opt gelf-address=udp://127.0.0.1:12201 ubuntu /bin/sh -c 'while true; do date "+%d-%m-%Y %H:%M:%S:%3N"; sleep 1 ; done

请注意,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) 进程现在仅在行级别发生,而不是作为CROSS-JOIN发生。

您还可以使用WHERE子句过滤掉您想要的内容(在这种情况下,我删除了所有没有任何与之关联的促销ID的行。例如,您还可以过滤掉某些 eventcategories 标签如果您愿意)。