首页 > 解决方案 > 给定另一个字段的值,SQL 创建一个新字段会话

问题描述

我在处理以下任务时遇到问题。

给定一张像

|    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

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(),但我总是发现一个极端情况,这使得所有尝试都失败了。此外,我完全确信有一种非常简单的方法,我没有考虑到这一点。

标签: sqlwindow-functions

解决方案


您可以使用累积总和:

select pv.*,
       (1 + sum(new_session) over (partition by user_id order by hit_id)) as session_number
from pageviews pv;

是一个 db-fiddle。


推荐阅读