用于跟踪用户在会话中访问的一系列站点的 SQL 查询

问题描述 投票:0回答:1

我需要跟踪用户在会话中访问的站点的顺序。我的数据如下所示:

访客 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)

sql postgresql vertica
1个回答
0
投票

这是一个间隙和岛屿问题。您可以使用传统的解决方案:

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 处的运行示例。

© www.soinside.com 2019 - 2024. All rights reserved.