我记录了带有开始和结束时间戳的会话持续时间:
user_id | session_id | session_start | session_end
--------+------------+-------------------------------+------------------------------
1 | 1 | 2021-02-25 10:10:00.000 +0100 | 2021-02-25 10:20:00.000 +0100
1 | 2 | 2021-02-25 10:50:00.000 +0100 | 2021-02-25 10:55:00.000 +0100
1 | 3 | 2021-02-25 11:40:00.000 +0100 | 2021-02-25 12:30:00.000 +0100
获取每个会话的持续时间就像减去两个时间戳一样简单。现在,我想用挂钟每小时桶来表示会话持续时间,每个用户求和。
这里的主要问题是间隔跨越多个小时的会话。一个从 11:40 开始到 12:30 结束的会话应该用 11:00 20 分钟的存储桶和 12:00 30 分钟的存储桶来表示:
user_id | bucket | duration
--------+----------+---------
1 | 00:00:00 | 00:00:00
1 | 01:00:00 | 00:00:00
...
1 | 10:00:00 | 00:15:00
1 | 11:00:00 | 00:20:00
1 | 12:00:00 | 00:30:00
我尝试使用time_series
and date_trunc
,但没有成功。
理想情况下,存储桶还包括日期,这也可能简化逻辑。如果没有,一次选择一天也可以。
user_id | bucket | duration
--------+---------------------+----------
1 | 2021-02-25 00:00:00 | 00:00:00
1 | 2021-02-25 01:00:00 | 00:00:00
...
1 | 2021-02-25 10:00:00 | 00:15:00
1 | 2021-02-25 11:00:00 | 00:20:00
1 | 2021-02-25 12:00:00 | 00:30:00
我将使用查询结果生成一个热图,其中一个轴为用户,另一个轴为小时。