[英]How to find the total number of events before the second login time
在 BigQuery 中,我试图找到第二次登录时间之前的事件总数。
对于不同的用户 ID,我有多个事件,例如“滚动”、“用户参与”、“登录”、“first_visit”、“sign_up”等。为简单起见,我们将以上视为所有事件。
例如,对于 user_id 2,我从原始数据中提取了以下信息(这是表的快照)。
用户身份 | 事件名称 | 事件时间 |
---|---|---|
2个 | 滚动 | 2022-10-31 12:28:35 |
2个 | 报名 | 2022-10-29 08:11:29 |
2个 | 登录 | 2022-11-01 16:46:34 |
2个 | 第一次访问 | 2022-10-30 10:45:22 |
2个 | 登录 | 2022-11-04 08:10:38 |
2个 | 滚动 | 2022-11-05 11:18:35 |
2个 | 用户参与 | 2022-11-06 08:45:17 |
2个 | 用户参与 | 2022-11-07 05:27:32 |
首先,我找到每个用户id的第二次登录时间。
WITH cte AS (
SELECT *, RANK() OVER (PARTITION BY User_id ORDER BY LoginTime) rnk
FROM MyData
)
SELECT User_id, LoginTime AS SecondLoginTime
FROM cte
WHERE rnk = 2
ORDER BY User_id;
用户身份 | 第二次登录时间 |
---|---|
1个 | 2022-11-07 09:52:27 |
2个 | 2022-11-04 08:10:38 |
我想编写一个查询,我可以将此登录时间与每个事件时间(对于所有用户 ID)进行比较,并计算 SecondLoginTime 之前的事件。
例如,对于 user_id 2,我想做如下比较:
用户身份 | 事件名称 | 事件时间 | 第二次登录时间 |
---|---|---|---|
2个 | 滚动 | 2022-10-31 12:28:35 | 2022-11-04 08:10:38 |
2个 | 报名 | 2022-10-29 08:11:29 | 2022-11-04 08:10:38 |
2个 | 登录 | 2022-11-01 16:46:34 | 2022-11-04 08:10:38 |
2个 | 第一次访问 | 2022-10-30 10:45:22 | 2022-11-04 08:10:38 |
2个 | 登录 | 2022-11-04 08:10:38 | 2022-11-04 08:10:38 |
2个 | 滚动 | 2022-11-05 11:18:35 | 2022-11-04 08:10:38 |
2个 | 用户参与 | 2022-11-06 08:45:17 | 2022-11-04 08:10:38 |
2个 | 用户参与 | 2022-11-07 05:27:32 | 2022-11-04 08:10:38 |
并找到以下结果:
用户身份 | 第二次访问前的总事件数 |
---|---|
2个 | 4个 |
我还想将此逻辑应用于所有用户 ID。
有没有办法做到这一点? 如果有任何遗漏或问题不清楚,请问我澄清。 非常感谢你的帮助。
您可以考虑以下。
WITH cte AS (
SELECT *,
NTH_VALUE(IF(Event_name = 'login', EventTime, NULL), 2 IGNORE NULLS) OVER w AS SecondLoginTime,
LAST_VALUE(IF(Event_name = 'login', EventTime, NULL) IGNORE NULLS) OVER w AS LastLoginTime
FROM MyData
WINDOW w AS (PARTITION BY User_id ORDER BY EventTime ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
)
SELECT User_id,
COUNTIF(EventTime < SecondLoginTime) AS TotalEventsBeforeSecondLogin,
COUNTIF(EventTime < LastLoginTime) AS TotalEventsBeforeLastLogin,
FROM cte
GROUP BY 1;
查询结果
这应该工作:
with LI2 AS (
SELECT User_Id, EventTime as LoginTime, ROW_NUMBER() OVER (PARTITION BY User_id ORDER BY EventTime) Seq
FROM MyTbl
where Event_Name='login'
)
SELECT
LI2.User_id
, LI2.LoginTime AS SecondLoginTime
, COUNT(OE.User_ID) as EventsBefore2ndLogin
FROM LI2
left join
MyTbl OE -- other events before 2nd login
on OE.User_Id=LI2.USer_Id
and OE.EventTime<LI2.LoginTime
WHERE LI2.Seq = 2
GROUP BY
LI2.User_id
, LI2.LoginTime
ORDER BY LI2.User_id
MyTbl 是您的表。
更新以适应“上次登录前的事件:
with LogInSeq AS (
SELECT User_Id
, max(case when LoginSeq=2 then LoginTime else null end) as SecondLoginTime
, max(case when RevLoginSeq=1 then LoginTime else null end) as LastLoginTime
from (
SELECT User_Id, EventTime as LoginTime
, ROW_NUMBER() OVER (PARTITION BY User_id ORDER BY EventTime) LogInSeq
, ROW_NUMBER() OVER (PARTITION BY User_id ORDER BY EventTime desc) RevLoginSeq
FROM MyTbl
where Event_Name='login'
) LI1
where LoginSeq=2 or RevLoginSeq=1
group by User_Id
)
SELECT
LISeq.User_id
, LISeq.SecondLoginTime
, LISeq.LastLoginTime
, COUNT(case when OE.EventTime < LISeq.SecondLoginTime then OE.User_id else null end) as EventsBefore2ndLogin
, COUNT(case when OE.EventTime < LISeq.LastLoginTime then OE.User_id else null end) as EventsBeforeLastLogin
FROM LogInSeq as LISeq
left join
MyTbl OE -- other events before 2nd login
on OE.User_Id=LISeq.USer_Id
GROUP BY
LISeq.User_id
, LISeq.SecondLoginTime
, LISeq.LastLoginTime
ORDER BY LISeq.User_id;
不可否认,我不知道 BigQuery 中的高级功能,例如@JayTiger 的回答所展示的功能,因此您可以使用 COUNTIF 和 NTH_VALUE 函数(我无权访问它们)来简化它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.