如何根据 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 分析中获取事件转换