我在完成以下任务时遇到问题。
给定一个表
| user_id | hit_id | new_session |
|---------------|--------------|--------------|
| 1 | 1 | 0 |
| 1 | 2 | 0 |
| 1 | 3 | 1 |
| 1 | 4 | 0 |
| ... | ... | ... |
| 5 | 19 | 0 |
在哪里
user_id
,并hit_id
是唯一new_session
是一个布尔值,用于确定该点击是否为该特定用户启动了一个新会话我想创建一个新列,session_number
将 hit_ids 拆分为会话,考虑到:
user_id
,一旦按顺序排序,hit_id asc
新列的值为 1session_number
new_session
0,值就session_number
保持不变new_session
是 1 时,我必须将 1 与实际会话数相加user_id
ordered by对分区进行处理hit_id asc
,因此一旦user_id
发生更改,会话计数将被重置user_id = 1
(涵盖多个极端情况)的预期输出将是:
| user_id | hit_id | new_session | session_number |
|---------------|--------------|--------------|----------------|
| 1 | 1 | 0 | 1 |
| 1 | 2 | 0 | 1 |
| 1 | 3 | 1 | 2 |
| 1 | 4 | 0 | 2 |
| 1 | 5 | 0 | 2 |
| 1 | 6 | 1 | 3 |
| 1 | 7 | 0 | 3 |
| 1 | 8 | 1 | 4 |
| 1 | 8 | 1 | 5 |
我尝试过使用滞后()、排名()和密集排名()的组合,但我总是发现一个使所有尝试都失败的极端情况。此外,我完全确定有一种非常简单的方法,但我没有考虑到。
您可以使用累积总和:
select pv.*,
(1 + sum(new_session) over (partition by user_id order by hit_id)) as session_number
from pageviews pv;
这是一个数据库小提琴。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句