我需要跟踪用户在会话中访问的站点的顺序。我的数据如下所示:
访客 | session_num | 网站 | page_view_num | 时间戳 |
---|---|---|---|---|
用户A | 2 | A站 | 1 | 2024-03-22 11:41:10 |
用户A | 2 | A站 | 2 | 2024-03-22 11:41:14 |
用户A | 2 | A站 | 3 | 2024-03-22 11:41:16 |
用户A | 2 | B站 | 4 | 2024-03-22 11:41:47 |
用户A | 2 | B站 | 5 | 2024-03-22 11:42:18 |
用户A | 2 | B站 | 6 | 2024-03-22 11:42:19 |
用户A | 2 | C站 | 7 | 2024-03-22 11:42:55 |
用户A | 2 | C站 | 8 | 2024-03-22 11:43:18 |
用户A | 2 | C站 | 9 | 2024-03-22 11:43:31 |
用户A | 2 | A站 | 10 | 2024-03-22 11:52:19 |
用户A | 2 | A站 | 11 | 2024-03-22 10:52:21 |
用户B | 4 | B站 | 1 | 2024-03-25 10:52:30 |
用户B | 4 | B站 | 2 | 2024-03-25 10:52:40 |
用户B | 4 | A站 | 3 | 2024-03-25 10:53:50 |
用户B | 4 | B站 | 4 | 2024-03-25 10:54:19 |
我正在尝试实现这样的目标(**site_num **column)
访客 | session_num | 网站 | page_view_num | site_num | 时间戳 |
---|---|---|---|---|---|
用户A | 2 | A站 | 1 | 1 | 2024-03-22 11:41:10 |
用户A | 2 | A站 | 2 | 1 | 2024-03-22 11:41:14 |
用户A | 2 | A站 | 3 | 1 | 2024-03-22 11:41:16 |
用户A | 2 | B站 | 4 | 2 | 2024-03-22 11:41:47 |
用户A | 2 | B站 | 5 | 2 | 2024-03-22 11:42:18 |
用户A | 2 | B站 | 6 | 2 | 2024-03-22 11:42:19 |
用户A | 2 | C站 | 7 | 3 | 2024-03-22 11:42:55 |
用户A | 2 | C站 | 8 | 3 | 2024-03-22 11:43:18 |
用户A | 2 | C站 | 9 | 3 | 2024-03-22 11:43:31 |
用户A | 2 | A站 | 10 | 4 | 2024-03-22 11:52:19 |
用户A | 2 | A站 | 11 | 4 | 2024-03-22 10:52:21 |
用户B | 4 | B站 | 1 | 1 | 2024-03-25 10:52:30 |
用户B | 4 | B站 | 2 | 1 | 2024-03-25 10:52:40 |
用户B | 4 | A站 | 3 | 2 | 2024-03-25 10:53:50 |
用户B | 4 | B站 | 4 | 3 | 2024-03-25 10:54:19 |
本质上,对每个站点的访问应该按顺序分组(按访问者、session_num 分区) - 我已经尝试了各种窗口功能,但当用户返回到他们在会话早期访问过的站点时,我遇到了一些情况,这需要算作一个单独的实例
例如对于用户 A,顺序为:站点 A (site_num=1) > 站点 B (site_num=2) > 站点 C (site_num=3) > 站点 A (site_num=4)
这是一个间隙和岛屿问题。您可以使用传统的解决方案:
select *, sum(i) over(partition by visitor order by page_view_num) as site_num
from (
select *,
case when site = lag(site) over(partition by visitor order by page_view_num)
then 0 else 1 end as i
from t
) x
结果:
visitor session_num site page_view_num timestamp i site_num
-------- ------------ ------- -------------- -------------------- -- --------
User A 2 Site A 1 2024-03-22 11:41:10 1 1
User A 2 Site A 2 2024-03-22 11:41:14 0 1
User A 2 Site A 3 2024-03-22 11:41:16 0 1
User A 2 Site B 4 2024-03-22 11:41:47 1 2
User A 2 Site B 5 2024-03-22 11:42:18 0 2
User A 2 Site B 6 2024-03-22 11:42:19 0 2
User A 2 Site C 7 2024-03-22 11:42:55 1 3
User A 2 Site C 8 2024-03-22 11:43:18 0 3
User A 2 Site C 9 2024-03-22 11:43:31 0 3
User A 2 Site A 10 2024-03-22 11:52:19 1 4
User A 2 Site A 11 2024-03-22 10:52:21 0 4
User B 4 Site B 1 2024-03-25 10:52:30 1 1
User B 4 Site B 2 2024-03-25 10:52:40 0 1
User B 4 Site A 3 2024-03-25 10:53:50 1 2
User B 4 Site B 4 2024-03-25 10:54:19 1 3
请参阅 db<>fiddle 处的运行示例。