我有一个查询,在该查询中,我有一个大约2万名用户的列表,它们表示该月的某个星期内他们已经登录到我们的网站。
我需要获得的-对于这些用户,在过去30天内(如果有) 1.登录:由记录在同一表中的任何行定义 2. 30天窗口中的最大事件,在当前where子句中的日期之前
这是当前的代码段,可帮助我在给定的一周内缩小到约2万名用户,以开始:
select
user_id,
max(timestamp)
from table
where timestamp between '2019-02-01' and '2019-02-05'
group by 1,2;
预期的结果集/列:
答案 0 :(得分:2)
我认为这就是您要寻找的。虽然不确定这是否是最有效的方法-也许开窗功能可能会更好,但是就像提到的bob-mccormick一样:棘手的地方是要填充用户(分区键)未处于活动状态的日期,以便范围查询能够正常工作。
示例数据设置(雪花语法)
-- Create sample table
create temporary table user_logins (userid number, date_logged_on timestamp);
;
-- Insert some random sample data
insert overwrite into user_logins
select
uniform(1,10,random()) userid,
dateadd('minutes', uniform(1,86400,random()) * -1,current_timestamp::timestamp_ntz) date_logged_on
from table(generator(rowcount => 100))
;
选择语句
-- Run select
with user_last_logins as (
select
userid,
max(date_logged_on) last_login
from user_logins
where
date_logged_on between '2019-01-01' and '2019-05-08'
group by userid
)
select
user_last_logins.userid,
max(user_last_logins.last_login) last_logged_on,
count(prior_30_each_user.userid) num_logins_prior_30,
max(prior_30_each_user.date_logged_on)
from user_last_logins
left join user_logins prior_30_each_user
on user_last_logins.userid = prior_30_each_user.userid
and prior_30_each_user.date_logged_on > dateadd('day', -30, user_last_logins.last_login) and prior_30_each_user.date_logged_on < user_last_logins.last_login
group by user_last_logins.userid
;