【问题标题】:SQL create a new field sessions given the value of another field给定另一个字段的值,SQL 创建一个新字段会话
【发布时间】: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_idhit_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_idhit_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


【解决方案1】:

您可以使用累积和:

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

Here 是一个 db-fiddle。

【讨论】:

  • ::facepalm:: 为什么别人做的事情看起来那么容易:)。这正是我所需要的
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
相关资源
最近更新 更多