【发布时间】:2021-07-14 11:32:11
【问题描述】:
我在完成以下任务时遇到问题。
给定一个像这样的表
| 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排序,新列session_number的值就为1 - 只要
new_session为0,session_number的值不变 -
new_session为 1 时,我必须将 1 与实际会话数相加 - 逻辑在
user_id按hit_id asc排序的分区上运行,因此一旦user_id更改,会话计数就会重置
我创建了一个db-fiddle with some example data
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 |
我尝试过将 lag()、rank() 和 dense_rank() 组合使用,但我总是发现一个极端情况,这会使所有尝试都失败。此外,我完全确信有一个非常简单的方法,我没有考虑到这一点。
【问题讨论】:
标签: sql window-functions