如何根据 BigQuery 中的最新事件获取在特定时间点处于活动状态的 user_id 数组?

Posted

技术标签:

【中文标题】如何根据 BigQuery 中的最新事件获取在特定时间点处于活动状态的 user_id 数组?【英文标题】:How to get an array of user_id's being active at a specific point in time based on their latest event in BigQuery? 【发布时间】:2021-02-25 16:05:39 【问题描述】:

我有一个问题,我想让所有 user_id 每天都处于“活动”状态。仅当用户的状态发生变化时才会记录事件。应该保留每个 user_id 的状态,直到触发“非活动”事件(参见示例数据和结果)。不同的用户可以在同一天更改他们的状态。

我该怎么做?我尝试使用 ARRAY_AGG 并将两个不同的事件分组并使用基于 this answer 的延迟。我陷入了需要从数组中减去获取非活动事件的 user_id 的阶段。

SELECT DATE("2019-11-11") as date, 1 as user_id, "inactive" as state UNION ALL 
SELECT DATE("2019-11-12"), 2, "active" UNION ALL   
SELECT DATE("2019-11-13"), 1, "active" UNION ALL 
SELECT DATE("2019-11-14"), 1, "inactive" UNION ALL
SELECT DATE("2019-11-14"), 3, "active" UNION ALL 
SELECT DATE("2019-11-15"), 2, "inactive"

期望的输出:

date      | active_users

2019-11-11| []
2019-11-12| [2]
2019-11-13| [2,1]
2019-11-14| [2,3]
2019-11-15| [3]

感谢我能得到的所有帮助!

【问题讨论】:

当用户在同一天内多次更改其状态时 - 仅具有日期是不够的 - 您需要具有时间戳或日期时间,以便可以识别正确的状态顺序。请考虑并解决您的问题 我还建议提供更多示例数据以涵盖不同的情况,因为我觉得您当前的示例仍然过于简单,并且可能会触发后续跟进 【参考方案1】:

一种方法是生成一个系列并聚合。首先,获取活动天数范围:

select t.*, date_add(next_inactive, interval -1 day)
from (select t.*,
             min(case when status = 'inactive' then date end) over (partition by user_id order by date desc) as next_inactive,
             max(date) over () as max_date
      from t 
     ) t
where state = 'active'

然后生成日期并聚合:

select day, array_agg(user_id)
from (select t.*, date_add(next_inactive, interval -1 day) s last_active_date
      from (select t.*,
                   min(case when status = 'inactive' then date end) over (partition by user_id order by date desc) as next_inactive,
                   max(date) over () as max_date
            from t 
           ) t
      where state = 'active'
     ) t cross join
     unnest(generate_date_array(date, coalesce(last_active_date, max_date), interval 1 day) day
group by day;

【讨论】:

以上是关于如何根据 BigQuery 中的最新事件获取在特定时间点处于活动状态的 user_id 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 BigQuery 中的 Firebase 事件中获取用户表?

如何在 SQL Bigquery 中的另一个事件之前计算特定事件的数量?

如何通过 BigQuery 从 Firebase 分析中获取事件转换

Bigquery:如何根据特定时间范围聚合几列的数据?

如何在 Google BigQuery 中使用 UNNEST 函数获取 COUNT?

如何根据最新日期从多条记录中获取特定记录