首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL/BigQuery中固定持续时间的滑动窗口

SQL/BigQuery中固定持续时间的滑动窗口
EN

Stack Overflow用户
提问于 2020-02-27 05:33:01
回答 1查看 152关注 0票数 1

我有一个时间序列(userid, timestamp),我想确定会话。

会话在用户级别由5分钟的固定窗口定义,该窗口为不在先前会话中的每个新行启动(理想情况下,窗口持续时间取决于给定用户的先前行数,但目前我可以接受固定的窗口持续时间)。

代码语言:javascript
复制
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语法中应该是可行的。

感谢您的帮助/提示!

EN

回答 1

Stack Overflow用户

发布于 2020-02-27 05:38:50

我想你需要lag()和一个累加和:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60422894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档