- ID (int identity) - RangeFrom (仅日期) - RangeTo (仅日期)
对于任何给定的日期范围,可能存在任意数量的记录与其重叠(完全或部分重叠)。
条件:
1. 每个具有更高ID(较新记录)的记录优先于可能重叠(完全或部分)的旧记录。 2. 范围至少为1天(RangeFrom和RangeTo相差一天)
因此,对于给定的日期范围(不超过5年),我需要:
1. 获取所有落在此范围内(完全或部分)的范围记录。 2. 将这些重叠拆分为非重叠范围。 3. 返回这些新的、不重叠的范围。
我的理解:
由于涉及到范围相关的大量复杂数据(许多连接等等),处理器+内存功率比SQL数据库引擎要高效得多,因此我决定将重叠数据从DB加载到我的数据层,并在内存中进行范围切割/拆分。这样让我在开发和执行方面具有更大的灵活性和速度。
如果您认为DB应该更好地处理它,请告诉我。
问题:
我想编写最快且尽可能节约资源的转换算法。由于我有很多这些记录,并且它们与各种用户相关,因此我必须为每个用户及其一组重叠范围数据运行此算法。
如何最有效地(快速且不占用资源)拆分这些重叠的范围?
例如数据:
我有ID = 1到ID = 5的记录,它们以以下方式可视化重叠(实际日期并不相关,我更好地展示这些重叠):
6666666666666
44444444444444444444444444 5555555555
2222222222222 333333333333333333333 7777777
11111111111111111111111111111111111111111111111111111111111111111111
结果应该像这样:
111111166666666666664444444444444444444444333333333555555555511111117777777
实际上,结果看起来就像我们从上面看这些重叠区域,然后获取我们从这个自上而下的视角看到的ID。
结果实际上将被转换为新的范围记录,因此旧的ID变得不相关。但它们的RangeFrom
和RangeTo
值(以及所有相关数据)将被使用:
111111122222222222223333333333333333333333444444444555555555566666667777777
当然,这只是重叠范围的一个示例。对于任何给定的日期范围,记录数可以从0到X不等。正如我们所看到的,范围ID=2被4和6完全覆盖,因此它变得完全过时了。
date
而不是datetime
。并且两个列都包含日期范围(范围内包括两个日期)。 - Robert Koritnik