我正在学习 BigQuery,并且对 SQL 有一定的了解。我和我的同事都建立了一个查询来计算我们网站上看到特定事件的 session 数,其中 eventInfo.eventCategory = "view"
和 hits.eventInfo.eventAction = "basket"
.我使用了 case 语句,他们使用了带有连接的子查询。
带有 case 语句的版本给出的答案与在 Google Analytics 中看到的不同,因为使用子查询和左连接的版本给出了匹配的结果(这是我们正在寻找的结果)。
第一个查询有问题还是我对案例语句的理解和我的实现有误?
我选择使用 case 语句,因为我们有很多用于构建漏斗的事件,并且我认为添加更多的 case 语句会比大量的子查询和连接更容易编写、阅读和维护。
任何有助于理解为什么这些会产生不同结果的帮助将不胜感激。
(这是我的第一篇文章,所以我希望我已经包含了足够多/没有太多信息)。
使用 的版本案例 陈述:
#standardSQL
select
count(CONCAT(t1.fullvisitorid, CAST(t1.visitID AS string))) AS sessions
,case
when (lower(hits.eventInfo.eventCategory) = "view"
and lower(hits.eventInfo.eventAction) = "basket")
then "Basket"
end
as funnel_stage
,hits.eventInfo.eventCategory
,hits.eventInfo.eventAction
,t1.date as _date
FROM
`table_name` t1
,UNNEST(hits) hits
where totals.visits = 1
group by _date
,hits.eventInfo.eventCategory
,hits.eventInfo.eventAction
having funnel_stage is not null
使用 的版本子查询 和 加入 :
#standardSQL
select
count(distinct(s.session)) as All_Sessions,
count(distinct(e.session)) as Segment
from
(
select CONCAT(fullvisitorid, CAST(visitID AS string)) as session
from `table_name`
) s
left join
(
select CONCAT(fullvisitorid, CAST(visitID AS string)) as session
from `table_name`,
unnest(hits) h
where
lower(eventInfo.eventCategory) = 'view'
AND lower(eventinfo.eventAction) = 'basket'
) e
on s.session = e.session
最佳答案
您查找特定事件的方法是 cross join
带有子表/数组的表hits
.但是,由于您希望在此命中级别上没有任何维度/组的情况下计算 session 数,因此不应将表扩展到命中范围。
而是使用子查询来访问这些子表/数组 - 您可以在 SELECT
中使用它们创建一个段的种类或在WHERE
直接过滤。
分段方法(使用 GA 样本数据集 - 所以这是一个不同的事件):
SELECT
date,
(SELECT
coalesce( LOGICAL_OR(eventinfo.eventcategory = 'Enhanced Ecommerce'
AND eventinfo.eventaction = 'Add to Cart'),false) FROM t.hits) hasAdd2CartEvent,
SUM(totals.visits) AS sessions
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_201707*` t
GROUP BY
1,2
ORDER BY 1,2
Coalesce 只是消除 NULL 值,以防在 session 中根本没有发现我们想要导致
false
的事件。 .WHERE
方法使用相同的子查询:SELECT
date,
SUM(totals.visits) AS sessions
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_201707*` t
WHERE
(SELECT
coalesce( LOGICAL_OR(eventinfo.eventcategory = 'Enhanced Ecommerce'
AND eventinfo.eventaction = 'Add to Cart'),false) FROM t.hits)
GROUP BY
1
ORDER BY 1
希望这使您能够编写更强大的查询:)
编辑:
以防万一您需要交叉加入到命中范围和计数 session ,您必须
COUNT(DISTINCT CONCAT(fullvisitorid, CAST(visitstarttime AS string))) AS sessions
关于sql - 为什么 BigQuery 中的 case 语句没有按预期运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49629266/