У меня есть данные диапазона дат в таблице БД SQL, в которой есть три (только соответствующие) столбца:
ID
(внутренний идентификатор)
RangeFrom
(только дата)
RangeTo
(только дата)
Для любого заданного диапазона дат может быть произвольное количество записей, которые могут перекрываться (полностью или частично).
Условия
- Каждая запись с более высоким
ID
(более новая запись) имеет приоритет над более старыми записями, которые могут перекрываться (полностью или частично)
- Диапазоны не менее 1 дня (
RangeFrom
и RangeTo
отличаются на один день)
Таким образом, для данного диапазона дат (не более 5 лет) мне нужно
- получить все записи диапазона, попадающие в этот диапазон (полностью или частично)
- разбить эти перекрытия на непересекающиеся диапазоны
- вернуть эти новые не перекрывающиеся диапазоны
Мой взгляд на это
Поскольку существует много сложных данных, связанных с этими диапазонами (много соединений и т. Д. И т. Д.), И поскольку мощность процессора + памяти намного более эффективна, чем у механизма SQL DB, я решил вместо этого загружать перекрывающиеся данные из DB в мой уровень данных и делать диапазон измельчения / расщепления в памяти. Это дает мне гораздо больше гибкости, а также скорости с точки зрения разработки и исполнения.
Если вы считаете, что это лучше обрабатывать в БД, дайте мне знать.
Вопрос
Я хотел бы написать самый быстрый и, если это вообще возможно, алгоритм преобразования не голодных ресурсов. Поскольку я получаю множество этих записей, и они относятся к разным пользователям, я должен запустить этот алгоритм для каждого пользователя и его набора данных перекрывающихся диапазонов.
Каков наиболее эффективный (быстрый и не требующий ресурсов) способ разделения этих перекрывающихся диапазонов?
Пример данных
У меня есть записи от ID=1
до ID=5
, которые визуально перекрываются таким образом (даты на самом деле не имеют значения, я могу лучше показать эти совпадения следующим образом):
6666666666666
44444444444444444444444444 5555555555
2222222222222 333333333333333333333 7777777
11111111111111111111111111111111111111111111111111111111111111111111
Результат должен выглядеть следующим образом:
111111166666666666664444444444444444444444333333333555555555511111117777777
Результат на самом деле выглядит так, как если бы мы смотрели на эти перекрытия сверху, а затем получали идентификаторы, которые мы видим из этого вид сверху.
Результат фактически преобразуется в новые записи диапазона, поэтому старые идентификаторы становятся неактуальными. Но будут использоваться их значения RangeFrom
и RangeTo
(вместе со всеми связанными данными):
111111122222222222223333333333333333333333444444444555555555566666667777777
Это, конечно, только пример перекрывающихся диапазонов. Это может быть что угодно от 0 записей до X для любого заданного диапазона дат. И как мы видим, диапазон ID = 2 полностью перезаписан на 4 и 6, поэтому он полностью устарел.