【发布时间】:2019-01-25 16:54:59
【问题描述】:
我有一个大型数据集,我想在其中汇总记录具有重叠时间的计数。例如,给定数据
[
{"id": 1, "name": 'A', "start": '2018-12-10 00:00:00', "end": '2018-12-20 00:00:00', count: 34},
{"id": 2, "name": 'B', "start": '2018-12-16 00:00:00', "end": '2018-12-27 00:00:00', count: 19},
{"id": 3, "name": 'C', "start": '2018-12-16 00:00:00', "end": '2018-12-20 00:00:00', count: 56},
{"id": 4, "name": 'D', "start": '2018-12-25 00:00:00', "end": '2018-12-30 00:00:00', count: 43}
]
您可以看到有 2 个活动重叠的时期。我想根据重叠所涉及的活动返回这些“重叠”的总数。所以上面会输出类似:
[
{start:'2018-12-16', end: '2018-12-20', overlap_ids:[1,2,3], total_count: 109},
{start:'2018-12-25', end: '2018-12-27', overlap_ids:[2,4], total_count: 62},
]
问题是,如何通过 postgres 查询生成它?正在研究 generate_series 然后计算出每个间隔中的活动,但这并不完全正确,因为数据是连续的 - 我真的需要确定确切的重叠时间,然后对重叠的活动进行求和。
EDIT 添加了另一个示例。正如@SRack 指出的那样,由于 A,B,C 重叠,这意味着 B,C A,B 和 A,C 也重叠。这无关紧要,因为我要查找的输出是 日期范围 的数组,该数组包含重叠活动,而不是所有独特的重叠组合。另请注意,日期是时间戳,因此具有毫秒精度,不一定都在 00:00:00。 如果有帮助,总计数可能会有 WHERE 条件。例如,只想查看总计数 > 100 的结果
【问题讨论】:
-
你有一些 JSON 数据还是这些表格行?
-
开头的交叉口A B怎么办(没有C)
-
以上只是 json 数据的一个缩减示例,是的,这些将是表格行(注意日期是完整的时间戳,而不仅仅是日期)
-
好点@s-man - 将更新