У меня есть небольшая хитрая работа, которая включает вычисление перекрытия между определенными диапазонами дат. Я написал немного кода в VBA / Excel, который прекрасно работает, но он ужасно медленный - и я думаю, что такого рода вещи принадлежат Access (или подобному), а не Excel в любом случае.
Очень краткое изложение того, что нужно делать ...
Иметь основную таблицу (может быть миллионы строк), которая выглядит примерно так:
Main_Table
- Account_Number_Index
- Дата_начала
- датой_окончания
- Data_Item_1
- Data_Item_2
...
...
...
- Data_Item_N
У меня также есть небольшая таблица "периодов анализа" (обычно только 4-6 строк)
Analysis_Periods
- Period_Index
- Period_Start_Date
- Period_End_Date
- Period_Label
Мне нужно создать выходную таблицу из всего этого, которая имеет одну запись для каждой комбинации Account_Number_Index и Period_Index. Поля будут:
Output_Table
- Account_Number_Index
- Overlap_Start_Date (поясняется ниже)
- Overlap_End_Date (поясняется ниже)
- Period_Index
- Data_Item_1
- Data_Item_2
...
...
...
- Data_Item_N
Так что в свободном псевдокоде это будет выглядеть примерно так:
For each row in Main_Table
For each row in Analysis_Periods
Work out the overlapping period (Overlap_Start_Date...Overlap_End_Date) for time intervals (Start_Date...End_Date) and (Period_Start_Date...Period_End_Date)
If there is no overlap at all
Do nothing
Else
Output a row of data to Output_Table which is identical to the row in the Main_Table except that:
* Overlap_Start_Date used instead of Start_Date
* Overlap_End_Date used instead of End_Date
* Period_Index and Period_Label tagged also output
End If
Next row in Analysis_Periods
Next row in Main_Table
Вычисление периода перекрытия - это всего лишь случай временного интервала между:
(a) max (Start_Date, Period_Start_Date)
(b) мин (конечная дата, период_ конечная дата)
Я думаю, что мне удалось включить гиперссылку внизу, чтобы немного нацарапать на бумаге: пересекающиеся временные интервалы, если это помогает визуализировать проблему.
Может кто-нибудь предложить эффективный способ сделать это в Access, пожалуйста, с помощью некоторого кода SQL или некоторого VBA (или обоих)?
Я не эксперт в этом деле, поэтому надеюсь, что в этом есть смысл ... извиняюсь, если нет.
Самый благодарный за любую помощь.
Thx
A
https://i.stack.imgur.com/Al3pO.jpg