SQL 给定另一个字段的值创建一个新字段会话
SQL create a new field sessions given the value of another field
我在执行以下任务时遇到问题。
给了一个 table 赞
| 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() 的组合,但我总能找到一个极端情况,使所有尝试都不成功。此外,我完全确定有一种我没有考虑到的非常简单的方法。
您可以使用累计和:
select pv.*,
(1 + sum(new_session) over (partition by user_id order by hit_id)) as session_number
from pageviews pv;
Here 是一个 db-fiddle.
我在执行以下任务时遇到问题。
给了一个 table 赞
| 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() 的组合,但我总能找到一个极端情况,使所有尝试都不成功。此外,我完全确定有一种我没有考虑到的非常简单的方法。
您可以使用累计和:
select pv.*,
(1 + sum(new_session) over (partition by user_id order by hit_id)) as session_number
from pageviews pv;
Here 是一个 db-fiddle.