[英]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.