Google 大查询 SQL 基于会话聚合数据

Google Big Query SQL Aggregate Data based on Sessions

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

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

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

因此,例如,在那种情况下,如果我想要一个聚合事件计数,结果 table 看起来像:

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

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

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

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

根据您的示例,会话似乎以 "login" 开头。所以,你可以为每个 userid:

做一个累积计数 "login"s
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;