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

标签 sql google-analytics google-bigquery

我正在学习 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/

相关文章:

sql - MSSQL 查找一列中有多少个 '\'

javascript - 我如何获取类似于数据库中字段的值?

sql - 按顺序数字分组

php - Google Analytics v3 绕过身份验证

google-analytics - gtag 多个自定义维度

php - 如何使用 mysql 数据库创建阻塞系统?

javascript - 如何使用仅使用 jQuery 构建的单页应用程序实现路由

sql - 如何在 BigQuery 中选择 CASE LIKE

google-bigquery - REGEXP_CONTAINS 无法识别

sql - 如何在 BigQuery 中获取连续时间戳之间的差异