我有一个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 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
等。
MaturityDate列中缺少一些日期(例如2015年7月4日),我想使用与相同MarkDate相关联的所有值(将于2015年7月2日)插入此值。
如何在Access中的值之间进行插值?我有一个用于Excel VBA的功能,但我很难将其转换为Access VBA。我正在考虑以
开头的东西Function CurveInterpolateRecordset(rsCurve As Recordset, InterpDate As Date) As Double
这样我就可以使用给定的曲线和日期直接插值,但我无法使其正常工作。
答案 0 :(得分:1)
这是一个简单的SQL解决方案。使用SQL server
制作,但所有功能都应在ACCESS
allDates
,您可以在其中存储所有可用日期,这样可以找到缺少的日期。创建该表非常容易functions。 rangesInter
如果范围为>1 day
您缺少日期,则计算范围。在这种情况下,请保存startRate
和changeRate
进行插值。
(min , max)
表一样。<强> SQL Fiddle Demo 强>
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;
答案 1 :(得分:0)
以下是识别缺失值的代码:
虽然第2页上的下载代码显示了如何查找缺少的日期:
有了这些,你会 - 如Varun所说 - 使用线性插值来计算缺失的测量结果。