为什么BigQuery中的case语句没有按预期运行?

时间:2018-04-03 11:45:34

标签: sql google-analytics google-bigquery

我正在学习BigQuery并且对SQL有一定的了解。我的同事和我都构建了一个查询来计算我们网站上已经看到特定事件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        

1 个答案:

答案 0 :(得分:2)

查找特定事件的方法是cross join表及其子表/数组hits。但是,由于您希望在此命中级别上没有任何维度/组的情况下计算会话,因此不应将表格扩展到命中范围。

而是使用子查询来访问这些子表/数组 - 您可以在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

如果在我们想要导致false的会话中没有找到任何事件,Coalesce就是消除NULL值。

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

希望这能让您编写更强大的查询:)

编辑: 万一你需要交叉连接到命中范围并计算会话,你必须COUNT(DISTINCT CONCAT(fullvisitorid, CAST(visitstarttime AS string))) AS sessions