1. 场景
老师开直播, 看当前在线的人数, 并计算每个人的观看直播的总时长来计算是否完课。
用户在直播间每隔2s上报心跳。 中间用户离开不算观看时长。
2.实现逻辑:
- 通过row_number 根据员工账号和直播id分组, 计算每次心跳的上一条记录和本条记录的时间差, 如果大于2s, 本次心跳就是一次观看的开始。 用户,直播id, 开始时间, 结束时间空写进mysql。 结束时间为空表示人在直播间呢。
- 通过2s 间隔 的session 窗口,当有超2s没上报心跳,表示用户离开直播间,窗口关闭,得到用户, 直播id ,开始时间, 结束时间, 以前三列为主键写mysql
- 最终得到了用户看一场直播的每一次进出的开始 结束时间。 没结束时间表示在直播间。
3. 问题
以点的时间作为一次进入的开始时间和结束时间是有误差的。
打开始的点之前,用户已经进来了, 把开始点作为进入时间, 晚了。
打结束的点时,用户也没立刻离开, 把结束时间作为离开时间,早了。