[英]SQL for Next/Prior Business Day from Calendar table (in MS Access)
我有一个从我们的大型机数据库中提取的日历表,并保存为本地Access表。 该表的历史可以追溯到1930年代(我知道我们至少在一个地方使用了50年代的历史),结果记录为31k。 该日历表具有3个感兴趣的字段:
Bus_Dt-每天,不仅是工作日。 首要的关键
Bus_Day_Ind-指示该日期对于股市来说是否是有效的工作日。
Prir_Bus_Dt-前一个工作日。 包含一些错误(大约50个),全部为旧错误。
我已经写了一个查询来检索当前日历日或之后的第一个工作日,但运行速度极其缓慢。 (5分钟以上),我检查了showplan输出,并看到它正在通过x-join运行,它在30k +个记录表之间提供了将近1000万个解决方案空间(以及日期比较)。 但是,实际任务并不难,并且可以通过Excel在最短的时间内使用简单的排序轻松完成。
因此,我的问题是,是否有任何方法可以解决查询性能差的问题,或者这是SQL固有的故障? (在大型机上运行的DB2速度也很慢,尽管不是很慢。在问题和所有这些方面都抛出了循环。)第二,如果我信任prir_bus_dt,我能达到更好的境地吗? 还是限制日期范围(又称“作弊”),或者其他我没想到的技巧?
SQL:
SELECT TE2Clndr.BUS_DT AS Cal_Dt
, Min(TE2Clndr_1.BUS_DT) AS Next_Bus_Dt
FROM TE2Clndr
, TE2Clndr AS TE2Clndr_1
WHERE TE2Clndr_1.BUS_DAY_IND="Y" AND
TE2Clndr.BUS_DT<=[te2clndr_1].[bus_dt]
GROUP BY TE2Clndr.BUS_DT;
展示计划:
Inputs to Query
Table 'TE2Clndr'
Table 'TE2Clndr'
End inputs to Query
01) Restrict rows of table TE2Clndr
by scanning
testing expression "TE2Clndr_1.BUS_DAY_IND="Y""
store result in temporary table
02) Inner Join table 'TE2Clndr' to result of '01)'
using X-Prod join
then test expression "TE2Clndr.BUS_DT<=[te2clndr_1].[bus_dt]"
03) Group result of '02)'
再次,问题是,这是否可以做得更好(更快),或者它已经变得足够好了?
我有一个新查询,对于同一工作,它的查询要快得多,但这取决于prir_bus_dt字段(有一些错误)。 这也不是很好的理论,因为不一定每个人的日历上都提供以前的工作日。 因此,我不认为这是“答案”,而只是答案。
新查询:
SELECT TE2Clndr.BUS_DT as Cal_Dt
, Max(TE2Clndr_1.BUS_DT) AS Next_Bus_Dt
FROM TE2Clndr
INNER JOIN TE2Clndr AS TE2Clndr_1
ON TE2Clndr.PRIR_BUS_DT = TE2Clndr_1.PRIR_BUS_DT
GROUP BY TE2Clndr.BUS_DT;
那这种方法呢
select min(bus_dt)
from te2Clndr
where bus_dt >= date()
and bus_day_ind = 'Y'
这是我对代表当前日期的date()
引用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.