浏览窗口划分

*会话划分,浏览窗口划分, 浏览记录分段划分

题目: 有浏览记录表, user_id(用户编号), page_id(界面编号), view_timestamp(浏览时间戳)
规定同一个用户,在相邻两次浏览时间间隔不超过60s, 算做是同义词浏览(在同一个浏览窗口, 同一个会话); 为浏览记录表增加一个浏览id(浏览窗口)字段, 同一个浏览窗口浏览id相同;

1. 数据准备
--准备数据
WITH live_events AS (
SELECT * FROM (
  VALUES  (1001, 1, 1700454270 ), (1002, 3, 1700455200 )
        , (1001, 1, 1700454286 ), (1003, 2, 1700454270 )
        , (1001, 2, 1700454312 ), (1003, 1, 1700454299 )
        , (1001, 1, 1700454384 ), (1003, 2, 1700454351 )
        , (1001, 2, 1700454412 ), (1003, 3, 1700454388 )
        , (1001, 1, 1700454436 ), (1003, 1, 1700454658 )
        , (1002, 2, 1700454270 ), (1003, 2, 1700454699 )
        , (1002, 1, 1700454288 ), (1004, 2, 1700454270 )
        , (1002, 2, 1700454321 ), (1004, 3, 1700454354 )
        , (1002, 3, 1700454348 ), (1004, 2, 1700454465 )
        , (1002, 1, 1700454536 ), (1004, 3, 1700454852 )
        , (1002, 2, 1700454921 ), (1004, 2, 1700454901 )
        , (1002, 2, 1700454989 ), (1004, 3, 1700455183 ) 
        
) AS table_name(user_id, page_id, view_timestamp)
)
2. 代码实现
-- 1. 将浏览时间戳下降一行, 使上一条和下一条浏览时间戳对齐
SELECT 
	  user_id, page_id, view_timestamp
	, LAG(view_timestamp, 1 , view_timestamp) OVER(PARTITION BY user_id ORDER BY view_timestamp) AS last_timestamp 
FROM live_events
user_idpage_idview_timestamplast_timestamp
1001117004542701700454270
1001117004542861700454270
1001217004543121700454286
1001117004543841700454312
1001217004544121700454384
1001117004544361700454412
1002217004542701700454270
1002117004542881700454270
1002217004543211700454288
-- 2. 计算下一条浏览记录和上一条浏览计算时间差, 时间差小于60s的标记为0, 大于等于60s的标记为1; 标记为0代表和前面是同一个窗口, 标记为1代表一个新的窗口;
SELECT 
  user_id, page_id, view_timestamp, last_timestamp
, IF (view_timestamp - last_timestamp  >= 60 , 1 , 0) AS tab
FROM (
    SELECT 
      user_id, page_id, view_timestamp
    , LAG(view_timestamp, 1 , view_timestamp) OVER(PARTITION BY user_id ORDER BY view_timestamp) AS last_timestamp 
    FROM live_events
) a 
user_idpage_idview_timestamplast_timestamptab
10011170045427017004542700
10011170045428617004542700
10012170045431217004542860
10011170045438417004543121
10012170045441217004543840
10011170045443617004544120
10022170045427017004542700
10021170045428817004542700
10022170045432117004542880
10023170045434817004543210
10021170045453617004543481
-- 3. 计算窗口编号, 第一个窗口为1, 后面每条记录加上窗口标记 tab, 得到的 tab2 就是窗口编号;
SELECT 
      user_id, page_id, view_timestamp, last_timestamp, tab
    , SUM(tab) OVER(PARTITION BY user_id ORDER BY view_timestamp) +1 AS tab2 
FROM (
    SELECT 
      user_id, page_id, view_timestamp, last_timestamp
    , IF (view_timestamp - last_timestamp  >= 60 , 1 , 0) AS tab
    FROM (
        SELECT 
          user_id, page_id, view_timestamp
        , LAG(view_timestamp, 1 , view_timestamp) OVER(PARTITION BY user_id ORDER BY view_timestamp) AS last_timestamp 
        FROM live_events
    ) a 
) b ;
user_idpage_idview_timestamplast_timestamptabtab2
100111700454270170045427001
100111700454286170045427001
100121700454312170045428601
100111700454384170045431212
100121700454412170045438402
100111700454436170045441202
100221700454270170045427001
100211700454288170045427001
100221700454321170045428801
100231700454348170045432101
100211700454536170045434812
100221700454921170045453613
100221700454989170045492114
-- 4. 将用户编号和窗口编号拼接成浏览id(窗口id)
SELECT 
      user_id, page_id, view_timestamp
    , CONCAT_WS('_', user_id, tab2) AS conversation_id
FROM (
    SELECT 
          user_id, page_id, view_timestamp, last_timestamp, tab
        , SUM(tab) OVER(PARTITION BY user_id ORDER BY view_timestamp) +1 AS tab2 
    FROM (
        SELECT 
          user_id, page_id, view_timestamp, last_timestamp
        , IF (view_timestamp - last_timestamp  >= 60 , 1 , 0) AS tab
        FROM (
            SELECT 
              user_id, page_id, view_timestamp
            , LAG(view_timestamp, 1 , view_timestamp) OVER(PARTITION BY user_id ORDER BY view_timestamp) AS last_timestamp 
            FROM live_events
        ) a 
    ) b
) c
;
user_idpage_idview_timestampconversation_id
1001117004542701001_1
1001117004542861001_1
1001217004543121001_1
1001117004543841001_2
1001217004544121001_2
1001117004544361001_2
1002217004542701002_1
1002117004542881002_1
1002217004543211002_1
1002317004543481002_1
1002117004545361002_2
end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了实现多输入多输出时的动态窗口大小,您可以考虑使用JavaScript和HTML5中的动态事件来实现。下面是一些实现的建议: 1. 监听窗口大小改变的事件。您可以使用JavaScript中的window.onresize事件,以便在窗口大小发生变化时重新调整输入和输出窗口的大小。 2. 动态调整输入和输出窗口的大小。您可以使用JavaScript中的DOM操作,例如document.getElementById()方法,来获取输入和输出窗口的元素,并根据窗口大小的变化来动态调整它们的大小。 3. 监听鼠标滚动事件。您可以使用JavaScript中的addEventListener()方法来添加鼠标滚动事件监听器,以便在输入窗口内容过长时,用户可以通过滚动鼠标滚轮来浏览全部内容。 4. 监听键盘事件。您可以使用JavaScript中的addEventListener()方法来添加键盘事件监听器,以便在用户输入过多内容时,自动扩大输入窗口的大小,以适应输入内容。 总之,使用JavaScript和HTML5中的动态事件可以实现动态窗口大小的输入和输出。 ### 回答2: 在多输入多输出时间预测问题中,滑动窗口输入可以通过以下方式实现: 1. 定义窗口大小:首先要决定滑动窗口的大小,这个大小是根据具体的问题和数据特征来决定的,可以根据经验设置或者通过交叉验证确定。 2. 确定滑动步长:滑动窗口的步长决定了每次滑动窗口的间隔,同样需要根据问题和数据特征来决定。步长过小导致冗余的计算,步长过大导致信息的丢失。 3. 数据重叠:为了提高模型的可靠性和泛化能力,通常在滑动窗口的实现中采用数据重叠的方式。即每次滑动窗口移动时,新窗口的数据包括前一个窗口的一部分数据,这样可以使模型在不同时间段的数据中进行学习和预测。 4. 形成训练样本:通过滑动窗口的方式,可以将原始数据序列划分成多个子序列。每个子序列可以看作是一个训练样本,其中包含了窗口内的数据作为输入特征,以及窗口外的数据作为输出特征。通过这样的方式,可以获得一系列训练样本用于建立模型。 5. 迭代训练:在实际应用中,通常需要根据滑动窗口的大小和步长,多次进行滑动窗口的迭代训练。每次迭代训练时,可以调整模型参数、优化算法等,以进一步提高模型的性能和预测效果。 滑动窗口输入的实现能够充分利用时间序列数据的时序性特点,提供了一种便捷且有效的方式来建立时间预测模型。同时,根据具体的问题和数据特征,我们可以进行灵活的调整和优化来适应不同的场景和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值