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

时间:2018-11-26 13:14:34

标签: sql google-bigquery standard-sql

我目前正在使用Big Query中的Google Analytics(分析)数据,但我尚无法确定的一件事是如何编写查询以从一个会话的事件中获取汇总数据。 我到处搜寻以寻找可能有效的方法,但到目前为止仍无法解决。 基本上,这就是表格的外观(大大简化了):

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

我现在要做的是通过用户AND会话聚合数据,而将会话定义为所有事件,直到为该用户显示另一个登录事件为止。 我假设我必须提出一个额外的字段“ session”,一旦遇到当前聚集的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 个答案:

答案 0 :(得分:0)

根据您的示例,会话似乎以“登录”开始。因此,您只需为每个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;