为每行查询获取 30 天前的数据

Get 30 days prior data for each row of query

我有一个查询,其中有一个包含 ~ 20k 用户的列表,该用户在一个月的特定一周内表示他们已登录到我们的网站。

我需要得到什么 - 对于这些用户中的每一个,在过去 30 天内,如果他们有 1. logged on: 由记录在同一table中的任何行定义 2. 当前 where 子句

中的日期之前的 30 天 window 中的最大事件

这是当前的代码片段,可帮助我在给定的一周内缩小到约 20,000 个用户:

select
   user_id,
   max(timestamp)
from table 
   where timestamp between '2019-02-01' and '2019-02-05'
group by 1,2;

预期结果set/columns:

  1. user_id,
  2. 最大(时间戳),
  3. logged_on,[如果他们在最大(时间戳)日期之前的 30 天内在同一 table 中有任何行数]
  4. previous_timestamp,[在最大(时间戳)日期之前 30 天内的第二个最近登录日期]

我想这就是您要找的。虽然不确定它是否是最有效的方法 - 也许窗口函数可能会执行得更好但像 bob-mccormick 提到的那样:棘手的一点是填写用户(分区键)不活动的日期,以便范围查询将起作用正确。

示例数据设置(Snowflake 语法)

-- 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))
;

Select 语句

-- 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
;