从 postgres 中的时间戳识别工作间隔

identify work intervals from timestamps in postgres

我正在尝试根据存储在 Postgres 中的带有时间戳的记录来确定“工作会话”的时长。这在 javascript/python/go 等中相当容易,但我想在 postgresql 中进行。

如果第一条记录是在晚上 10 点,并且至少每小时有一次记录,直到凌晨 4 点,然后间隔 10 小时,然后是另一组记录,我想将晚上 10 点到凌晨 4 点的记录分组到一个桶中,然后记录从下午 4 点+10 小时开始 - 每当有另一个数小时的差距时,进入另一个桶。

如何在 SQL 中编写检测“间隙”以定义桶边界的逻辑?没有固定的“开始时间”或“停止时间”。

一些示例记录

{'2021-05-05 22:00:05', 'user1'}, 
{'2021-05-05 22:25:33', 'user1'}, 
{'2021-05-05 23:33:11', 'user1'},
{'2021-05-06 00:08:34', 'user1'},
{'2021-05-06 00:36:22', 'user1'},
{'2021-05-06 22:15:00', 'user1'},
{'2021-05-06 23:08:00', 'user1'},
{'2021-05-07 00:01:03', 'user1'}

在上述记录中,一个桶是从 2021-05-05 22:00:05 - 2021-05-06 00:36:22 因为到下一条记录的时间间隔超过N小时

这就是我最后做的事情。我使用 Postgres 滞后函数将按时间排序的记录与最后一条记录进行比较,然后计算两条记录之间的差距。如果差距大于 X 则它是一个新桶。

基于 @AdamKG 建议的谷歌搜索“差距和岛屿”