我在 BigQuery 中有一个包含Xday
、Xmonth
和Xyear
列的表,但数据是用户生成的,并且显然在没有足够的输入验证的情况下完成,所以其中一些是无稽之谈。做类似的事情很容易,但是如果有人在 2 月 30 日Xday between 1 and 31
做这样的事情,我仍然会出错。date(Xyear, Xmonth, Xday)
有什么方法可以在转换为日期类型之前验证日期,或者只是扔掉导致错误的行而不是抛出异常?
这是一个示例数据集。
with activity_cte (day, user_id, act1, act2) as (
values
('2020-01-01'::date, 1, 0, 1),
('2020-01-01'::date, 3, 1, 0),
('2020-01-02'::date, 1, 3, 2),
('2020-01-02'::date, 2, 0, 2),
('2020-01-02'::date, 5, 0, 1),
('2020-01-03'::date, 1, 1, 2),
('2020-01-03'::date, 5, 1, 1),
('2020-01-04'::date, 2, 1, 1),
('2020-01-04'::date, 5, 4, 0)
)
select * from activity_cte;
在此我正在跟踪用户活动计数。我在这里跟踪两个活动:“act1”和“act2”,我只是总结了用户在一段时间内参与该活动的次数。目前,如果用户在某一天没有参与任何一项活动,他们就不会在当天出现(尽管如果需要可以更改)。例如,用户 2 在 1 月 2 日两次参与活动 2,并在 1 月 4 日两次参与这两项活动。
我想做的是计算每天“活跃”用户的数量,我将其定义为从前一天起至少参与过一项活动的用户(实际上大约是一周前,但我不想在此处设置的此示例中编写大量行)。所以这就是我想要返回的。
2020-01-01 2
2020-01-02 4
2020-01-03 3
2020-01-04 3
这似乎是我需要使用窗口函数的东西。也许我想多了,但我很难想出生成这些数字的实际方法。