我有一个时间序列(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;
我被卡住了,因为在我的推理中,确定一行是否启动新会话取决于前几行中的"new session“列值。
我的目标是BigQuery,所以理想情况下,它在BQ语法中应该是可行的。
感谢您的帮助/提示!
发布于 2020-02-26 21:38:50
我想你需要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
https://stackoverflow.com/questions/60422894
复制相似问题