У меня есть временной ряд (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.
Спасибо за любую помощь / подсказку!