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

时间:2019-05-07 20:07:05

标签: sql snowflake-datawarehouse snowflake

我有一个查询,在该查询中,我有一个大约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;

预期的结果集/列:

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

1 个答案:

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