簡體   English   中英

如何找到第二次登錄時間之前的事件總數

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM