我要做的一件棘手的小工作涉及计算某些日期范围之间的重叠。我已经在VBA / Excel中写了一些代码,可以正常工作,但是速度却非常慢-而且我认为这种事情属于Access(或类似的东西),而不是Excel。
关于需要做什么的简短摘要...
有一个主表(可能是几百万行),看起来像:
我还有一张小表格的“分析周期”(通常只有4-6行)
我需要从所有这些表创建一个输出表,其中Account_Number_Index和Period_Index的每种组合都有一个记录。字段为:
所以在宽松的伪代码中,它看起来像这样:
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
答案 0 :(得分:1)
请考虑两个表之间的过滤后的self.msg
,其中您将表放在beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [ ModalModule.forRoot() ],
declarations: [ MyDialogComponent ],
}).overrideModule(BrowserDynamicTestingModule, {
set: {
entryComponents: [ HelloComponent ],
}
}).compileComponents();
子句中以逗号分隔的列表中,并且在日期上没有任何CROSS JOIN
后跟FROM
。然后将查询放在条件汇总JOIN
内,以查找日期所需的WHERE
和GROUP 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。