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      |

哪里

我想创建一个新列 session_number,将 hit_ids 分成多个会话,同时考虑到:

我创建了一个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.