【发布时间】:2022-12-18 21:53:30
【问题描述】:
我正在尝试基于活动窗口为 redash 中的数据集创建一个 session_id。本质上,我有一个命中数据集,我想将其划分为会话,其中任意时间长度的不活动(我使用 30 分钟,但可以是任何时间)将指示会话结束(下一次命中将成为新的开始)。
我不是数据专家(因为以下内容将毫无疑问地证明)-我尝试使用滞后和前导 + 案例语句来识别会话的开始和结束,但我希望能够通过标记行中间也是会话的一部分(我想了解哪些用户最常使用该网站,哪些用户在该网站上的“旅程”最长)。
示例数据集:
| User_ID | Timestamp |
|---|---|
| A1 | 2022-08-10 21:29:00 |
| A1 | 2022-08-10 21:39:00 |
| A1 | 2022-08-10 21:59:00 |
| A1 | 2022-08-10 23:19:00 |
| A1 | 2022-08-10 23:25:00 |
| B2 | 2022-08-09 12:01:00 |
| B2 | 2022-08-10 15:02:00 |
| B2 | 2022-08-10 15:03:00 |
| B2 | 2022-08-10 15:42:00 |
我想得到什么:
| User_ID | Timestamp | Visit_ID |
|---|---|---|
| A1 | 2022-08-10 21:29:00 | 1 |
| A1 | 2022-08-10 21:39:00 | 1 |
| A1 | 2022-08-10 21:59:00 | 1 |
| A1 | 2022-08-10 23:19:00 | 2 |
| A1 | 2022-08-10 23:25:00 | 2 |
| B2 | 2022-08-09 12:01:00 | 1 |
| B2 | 2022-08-10 15:02:00 | 2 |
| B2 | 2022-08-10 15:03:00 | 2 |
| B2 | 2022-08-10 15:42:00 | 3 |
到目前为止我得到了什么:确定每个会话的开始:
SELECT
a.user_id,
a.timestamp,
case when timestamp - coalesce(lag(timestamp,1) over (partition by a.user_id order by timestamp),0) <= 1800 then 0
else timestamp
end as session_start
from example_dataset a
)
确定每个会话的结束:
SELECT
a.user_id,
a.timestamp,
case when coalesce(lead(a.timestamp,1) over (partition by a.user_id order by a.timestamp),0) - a.timestamp <= 1800 then 0
else a.timestamp
end as session_end
from example_dataset a
)
我不知道的是如何从那里得到我想要的漂亮整洁的数据集。你能帮我吗?
提前谢谢了!
【问题讨论】: