Скользящее окно с фиксированной продолжительностью в SQL / BigQuery - PullRequest
1 голос
/ 27 февраля 2020

У меня есть временной ряд (userid, timestamp), и я хотел бы определить сеансы.

Сеанс определяется на уровне пользователя фиксированным окном 5 минут, которое начинается для каждой новой строки, которая не находится в предыдущий сеанс (продолжительность окна в идеале будет зависеть от количества предыдущих строк для данного пользователя, но сейчас я могу жить с фиксированной продолжительностью окна), например:

WITH sample AS (
  SELECT 0 user_id, TIMESTAMP('2020-01-01T00:00:00Z') timestamp UNION ALL -- new session
  SELECT 1, TIMESTAMP('2020-01-01T00:00:00Z') UNION ALL -- new session
  SELECT 1, TIMESTAMP('2020-01-01T00:04:00Z') UNION ALL
  SELECT 1, TIMESTAMP('2020-01-01T00:06:00Z') UNION ALL -- new session
  SELECT 1, TIMESTAMP('2020-01-01T00:10:00Z') UNION ALL
  SELECT 1, TIMESTAMP('2020-01-01T00:11:00Z') UNION ALL -- new session
  SELECT 1, TIMESTAMP('2020-01-01T01:00:00Z')           -- new session
)
SELECT * 
FROM sample;

Я застрял, так как в моем рассуждение, определение, начинает ли строка новый сеанс, зависит от значения столбца «новый сеанс» из предыдущих строк.

Я нацеливаюсь на BigQuery, поэтому в идеале это должно выполняться в синтаксисе BQ.

Спасибо за любую помощь / подсказку!

1 Ответ

2 голосов
/ 27 февраля 2020

Я думаю, вы хотите lag() и накопленная сумма:

select s.*,
       sum(case when prev_ts > timestamp_add(timestamp, interval -5 minute)
                then 0 else 1  -- "1" starts a new session
           end) over (partition by user_id order by timestamp) as session_num
from (select s.*,
             lag(timestamp) over (partition by user_id order by timestamp) as prev_ts
      from sample s
     ) s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...