基于会话的 Google Big Query SQL 聚合数据

Posted

技术标签:

【中文标题】基于会话的 Google Big Query SQL 聚合数据【英文标题】:Google Big Query SQL Aggregate Data based on Sessions 【发布时间】:2018-11-26 13:14:33 【问题描述】:

我目前正在 Big Query 中使用 Google Analytics Data,我还没有搞清楚的一件事是如何编写查询以获取来自一个会话的事件的聚合数据。 我四处寻找可能有用的东西,但到目前为止还没有找到。 基本上,这就是表格的外观(大大简化):

UserID | event_name | event_timestamp
--------------------------------------
1      | login      | 1543171146125000
1      | other event| 1543171155329000
1      | other event| 1543171155341001
1      | login      | 1543171157796003
1      | other event| 1543171160541000
2      | login      | 1543171157796003
2      | other event| 1543171177531000

我现在要做的是通过用户和会话聚合数据,而会话被定义为所有事件,直到为该用户显示另一个登录事件。 我假设我必须想出一个附加字段“会话”,一旦遇到当前聚合的 UserID 的登录 event_name,它基本上总是显示一个新 ID。

因此,例如,在这种情况下,如果我想要汇总事件计数,则结果表将类似于:

UserID | session | EventCount
---------------------------
   1   |    1    |    3
   1   |    2    |    2
   2   |    1    |    2

我的假设是我可以使用一些子查询来获取那个神奇的“会话”字段,例如:

SELECT UserID, session, COUNT(event_name) as EventCount
FROM (Insert Magical Subquery here)
GROUP BY UserID, session

任何想法如何做到这一点?这似乎是一件简单的事情,但我就是想不通。

【问题讨论】:

【参考方案1】:

根据您的示例,会话似乎以“登录”开始。因此,您可以为每个 userid 做一个累积计数“登录”:

select t.*,
       countif(event_name = 'login') over (partition by userid order by event_timestamp) as session
from t;

然后您可以聚合:

select userid, session, count(*)
from (select t.*,
             countif(event_name = 'login') over (partition by userid order by event_timestamp) as session
      from t
     ) t
group by userid, session;

【讨论】:

这实际上正是我想要的!为此非常感谢!无法理解为什么它确实有效 - 你介意解释一下吗?

以上是关于基于会话的 Google Big Query SQL 聚合数据的主要内容,如果未能解决你的问题,请参考以下文章

更改不同属性之间的来源(Big Query - Google Analytics)

将Big Query中的数据自动导入Google表格?

Google Big Query 中的功能

Google Big Query 的奇怪活动

Google Data Studio:将用户输入写回 Google Big Query 表

如何将 Google Cloud SQL 与 Google Big Query 集成