Получите данные за 30 дней для каждой строки запроса - PullRequest
0 голосов
/ 07 мая 2019

У меня есть запрос, в котором у меня есть список из ~ 20 тысяч пользователей за определенную неделю месяца, который показывает, что они вошли на наш сайт.

Что мне нужно получить - для каждого из этих пользователей, за последние 30 дней, если они 1. вошли в систему: определяется любыми строками, записанными в той же таблице 2. событие max в окне 30 дней,до даты в текущем выражении where

Это текущий фрагмент кода, который помогает мне сузиться до ~ 20 000 пользователей за данную неделю, чтобы начать с:

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 (отметка времени),
  3. logged_on, [если у них есть # строк в одной таблице в течение 30 дней доих максимальная (временная метка) дата]
  4. previous_timestamp, [2-ая самая последняя дата входа в систему за 30 дней до их максимальной (временной метки) даты]

1 Ответ

2 голосов
/ 08 мая 2019

Я думаю, это то, что вы ищете.Хотя не уверен, что это самый эффективный метод - возможно, оконные функции могут работать лучше, но, как упомянул 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))
;

Выбор оператора

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