【问题标题】:identify work intervals from timestamps in postgres从 postgres 中的时间戳识别工作间隔
【发布时间】:2021-06-04 21:44:50
【问题描述】:

我正在尝试根据存储在 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小时。

【问题讨论】:

  • 没有时间回答 ATM 的完整答案,但请查找“差距和孤岛” - 这至少非常相似,可能只是其中的一个实例。

标签: postgresql group-by timestamp intervals


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2012-12-13
    • 2018-02-02
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多