Sql 在Access VBA中插入表中缺少的值
我有一个Access函数,可以将值表导出到Excel,格式如下Sql 在Access VBA中插入表中缺少的值,sql,database,ms-access,vba,Sql,Database,Ms Access,Vba,我有一个Access函数,可以将值表导出到Excel,格式如下 ID CurveShortName MarkRunID MarkDate ZeroCurveID MaturityDate ZeroRate DiscountFactor 15 CAD Sovereign 10091 7/2/2015 15-10091 7/2/2015 0.007499923 1 15 CAD Sovereign 10091 7/2/2015 15-10091
ID CurveShortName MarkRunID MarkDate ZeroCurveID MaturityDate ZeroRate DiscountFactor
15 CAD Sovereign 10091 7/2/2015 15-10091 7/2/2015 0.007499923 1
15 CAD Sovereign 10091 7/2/2015 15-10091 7/3/2015 0.007499923 0.999979452
15 CAD Sovereign 10091 7/2/2015 15-10091 7/5/2015 0.00899634 0.999186963
15 CAD Sovereign 10091 7/2/2015 15-10091 7/6/2015 0.008993128 0.998473566
等等
到期日期列中缺少一些日期,例如7/4/2015,我想使用与同一标记日期(即7/2/2015)相关的所有值来插值该值
如何在Access中的值之间插值?我有一个用于Excel VBA的函数,但我很难将其转换为Access VBA。我在考虑从
Function CurveInterpolateRecordset(rsCurve As Recordset, InterpDate As Date) As Double
所以我可以直接使用给定的曲线和日期进行插值,但我无法让它工作 以下是识别缺失值的代码: 第2页下载的代码显示了如何查找丢失的日期:
有了这些,您可以使用线性插值来计算缺失的测量值。这是一个简单的SQL解决方案。使用SQL server创建,但所有函数都应在ACCESS中找到 描述 我创建了一个简化版本的表,用于源代码创建插值 我创建了一个allDates表,您可以在其中存储所有可用的日期,这允许查找缺少的日期。有很多方法可以很容易地创建该表。 创建表范围如果范围大于1天,则计算范围,因为缺少日期。在这种情况下,保存起始值和变化率以进行插值。 完成后,我意识到这个查询也可以直接包含在select中,就像我创建min,max表一样。 将所有表连接在一起,结果是前3列,但我保留所有,以便您可以检查日期的来源。
您将如何识别丢失的日期?插值是指已知值的平均值还是其他什么?是的,插值我只是指零利率列中已知值的线性插值-因此,对于2015年7月4日,它将取2015年7月3日和2015年7月5日的平均值。我不知道如何识别丢失的日期;我正在考虑制作另一个列,包含完整的日期集作为参考,然后每当到期日期列与参考列不匹配时,它就可以进行插值。我的建议从简单开始,每次一个。嘿,谢谢你,我感谢你的帮助。你知道我将如何将这种功能移植到Access中吗?在SQL代码的大部分中使用strSQL函数似乎不起作用。什么是strSQL函数?我认为这应该在access中起作用,就像我说的,每次尝试构建一个查询。在您的解决方案中,ifi.MarkDate为NULL,r.MarkDate,I.MarkDate为MarkDate,a.MaturityDate,r.MarkDate和I.MarkDate之间的区别是什么?如果您检查fiddle演示,每行一个MarkDate为NULL,另一个不为NULL。一边是数据,另一边是插值数据。因此,如果一个为空,我使用另一个。
SELECT
IIF(i.MarkDate IS NULL, r.MarkDate, i.MarkDate) as MarkDate,
a.MaturityDate,
IIF(
i.ZeroRate IS NULL,
r.startRate + DATEDIFF ( day , r.begindate, a.MaturityDate ) * rateChange,
i.ZeroRate
) as ZeroRate, -- use values from r to interpolate rate
i.*, r.*
FROM allDates a
left Join Inter I
on a.MaturityDate = I.MaturityDate
cross join
(SELECT MIN(MaturityDate) minDate, MAX(MaturityDate) maxDate
FROM Inter) as t
left join rangesInter r
on a.MaturityDate > r.[begindate]
and a.MaturityDate < r.[enddate]
where a.MaturityDate >= t.minDate
and a.MaturityDate <= t.maxDate;