具有日期范围的棘手工作-MS Access / SQL

时间:2018-11-05 18:45:40

标签: sql date ms-access

我要做的一件棘手的小工作涉及计算某些日期范围之间的重叠。我已经在VBA / Excel中写了一些代码,可以正常工作,但是速度却非常慢-而且我认为这种事情属于Access(或类似的东西),而不是Excel。

关于需要做什么的简短摘要...

有一个主表(可能是几百万行),看起来像:

Main_Table

  • Account_Number_Index
  • 开始日期
  • 结束日期
  • Data_Item_1
  • Data_Item_2 ... ... ...
  • Data_Item_N

我还有一张小表格的“分析周期”(通常只有4-6行)

Analysis_Periods

  • 期间索引
  • 开始日期
  • 结束日期
  • Period_Label

我需要从所有这些表创建一个输出表,其中Account_Number_Index和Period_Index的每种组合都有一个记录。字段为:

Output_Table

  • Account_Number_Index
  • Overlap_Start_Date(下面解释)
  • Overlap_End_Date(下面解释)
  • 期间索引
  • Period_Lable
  • 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)最大值(开始日期,期间开始日期) (b)分钟(结束日期,期间结束日期)

我认为我已经设法在下面添加了一个超链接,以在纸上略作涂鸦:重叠的时间间隔,如果这有助于可视化问题。

有人可以用一些SQL代码或一些VBA(或两者)来建议在Access中进行此操作的有效方法吗?

我不是这方面的专家,所以我希望我有道理...如果没有,我深表歉意。

非常感谢您的协助。

Thx A

https://i.stack.imgur.com/Al3pO.jpg

2 个答案:

答案 0 :(得分:1)

请考虑两个表之间的过滤后的self.msg,其中您将表放在beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ ModalModule.forRoot() ], declarations: [ MyDialogComponent ], }).overrideModule(BrowserDynamicTestingModule, { set: { entryComponents: [ HelloComponent ], } }).compileComponents(); 子句中以逗号分隔的列表中,并且在日期上没有任何CROSS JOIN后跟FROM。然后将查询放在条件汇总JOIN内,以查找日期所需的WHEREGROUP BY

MIN

然后在第二个查询中,将原始表与索引字段上的该查询连接。甚至考虑构建临时表 overlap_table (带有MAX子句)并代替查询使用:

SELECT m.Account_Number_Index, 
       p.Period_Index, 
       MIN(IIF(m.Start_Date < a.Period_Start_Date, 
               m.Start_Date, a.Period_Start_Date)) AS Overlap_Start_Date,
       MAX(IIF(m.End_Date < a.Period_End_Date, 
               a.Period_End_Date, m.End_Date)) As Overlap_End_Date

FROM MainTable m, AnalysisPeriods a
WHERE m.Start_Date <= a.Period_Start_Date 
  AND a.Period_End_Date <= m.End_Date
GROUP BY m.Account_Number_Index, 
         p.Period_Index

注意:此处理过程涉及交叉连接,该交叉连接返回两个表之间的笛卡尔积(即,约100万行X 5-6行),因此不能保证效率。

答案 1 :(得分:0)

如果使用访问权限,为什么不使用联接查询? 相似

Select m.Account_Number_Index, m.Start_Date,m.End_Date, ap.Period_Index, ap.Period_Lable,
m.Data_Item_1, m.Data_Item_2 ... ... ... m.Data_Item_N
From Analysis_Periods as ap left join Main_Table as m on (m.Start_Date >= ap.Period_Start_Date and m.End_date <= ap.Period_End_Date)

对于正确的重叠开始和结束,请使用函数iif。