为每行查询获取 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:
- user_id,
- 最大(时间戳),
- logged_on,[如果他们在最大(时间戳)日期之前的 30 天内在同一 table 中有任何行数]
- 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
;
我有一个查询,其中有一个包含 ~ 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:
- user_id,
- 最大(时间戳),
- logged_on,[如果他们在最大(时间戳)日期之前的 30 天内在同一 table 中有任何行数]
- 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
;