获取区间内加权平均值的总和
Posted
技术标签:
【中文标题】获取区间内加权平均值的总和【英文标题】:Get Sum of weighted average over Interval 【发布时间】:2018-02-23 02:59:22 【问题描述】:首先,我使用的是 Microsoft Access 2002-2003 并在 VBA 中使用查询。这意味着如果可能的话,我需要一个完整的 SQL 字符串,我可以在其中插入来自 VBA 的自定义间隔边界。
我有一张这样布局的桌子:
Date | Value
1.1.2010 1
1.1.2012 2
1.1.2015 3
我需要一个 SQL 查询来获取变量 Interval 中值的加权平均值。
这个想法是值从一个日期应用到下一个日期,因此值 1 例如适用于从 1.1.2010 到 31.12.2011 等等。 可变间隔可以(并且大部分时间会)切入这些,所以如果我的间隔是从 1.7.2010 到 1.7.2012 我需要考虑 1.7.2010 - 31.12.2011 和 1.1.2012 - 1.7.2012 如果间隔在第一个日期之前开始,则使用第一个日期的值。
两个例子: 1.1.2010 - 31.12.2012 -> (2*1 + 2) / 3 = 1.33(两年 1 和一年 2) 1.1.2008 - 1.7.2012 -> (4*1 + 0.5 * 2) / 4.5 = 1.11(1 的四年和 2 之一的一半)
我最大的问题是获取这些多个间隔(尤其是自定义间隔),如果间隔在第一个日期之前开始,则将值默认为第一个。
我当前的查询:
SELECT SUM(t2.Value * DateDiff("d",t2.date,t1.date)) AS s1,
SUM(DateDiff("d",t2.date,t1.date)) AS s2, s1 / s2 AS s3
FROM table AS t1,
table AS t2
WHERE t2.date < t1.date
AND NOT Exists (SELECT t3.date, t4.date
FROM table AS t3,
table AS t4
WHERE t1.date = t3.date AND t4.date <> t2.date
AND t4.date > t2.date AND t4.date < t1.date
AND t2.date < t1.date e);
这给了我这样的东西:
s1 | s2 | s3
730 * 1 + 1096 * 2 730 + 1096 s1/s2
s1 是三个日期(2010-2012、2012-2015)之间间隔的加权和 s2 是这两个区间(5 年)的总和 然后 s3 是加权平均值。
查询通过将表加倍获取所有间隔,获取所有小于另一个日期的日期,然后删除日期在间隔中的日期为NOT EXISTS
现在我只需要将区间边界“添加”到方程中...
我现在的查询只适用于表格。 但我需要一个间隔: 当前输出:
s1 | s2 | s3
2922 1826 1.6
示例间隔为 1.1.2008 - 31.12.2016 的所需输出:
s1 | s2 | s3
~5841 3287 5841/3287`
所以间隔 1.1.2008 - 31.12.2011 和 1、1.1.2012 - 31.12.2014 和 2 和 1.1.2015 - 31.12.2016
【问题讨论】:
Now I just need to "add" the interval bounds into the equation
是什么意思?你的意思是你也想包括最高日期,并权衡它直到今天(或某个其他日期)的日期?您的方法似乎有效(不过,我可以对其进行优化以使其运行得更快)。请显示查询的当前输出(与您的示例表),以及查询的所需输出。
我现在的查询只适用于表。
但是你想要什么?我们无法理解您的想法,如果您希望它与多个表一起使用,您必须告诉我们,提供表结构,并明确说明您希望这些表如何协同工作
我现在的查询只适用于表。但我需要所有的时间间隔:当前输出:`s1 | s2 | s3
2922 1826 1.6
所需的输出,示例间隔为 1.1.2008 - 31.12.2016:`s1 | s2 | s3
~5841 3287 5841/3287
所以间隔 1.1.2008 - 31.12.2011 1、1.1.2012 - 31.12.2014 与 2 和 1.1.2015 - 31.12.2016
请编辑您的问题以包含该格式。
【参考方案1】:
我已经彻底重写了您的查询,添加了参数,并使用参数代替了 t2 的最低日期和 t1 的最高日期。
请注意,我已避免使用 Date
、Table
和 Value
等词,因为这些是 SQL 关键字,不能用于表名或列名。
一次要经历的有点多,但是如果您有具体问题,我会回答。
请注意,如果您想通过 VBA 执行此查询,则必须先设置参数。
PARAMETERS startInterval DateTime, endInterval DateTime;
SELECT SUM(t2.Weight *(IIF(t1.theDate IS NULL, endInterval, t1.theDate) - IIF(t2.theDate = (SELECT Min(theDate) FROM theTable), startInterval, t2.theDate))) AS s1,
SUM(IIF(t1.theDate IS NULL, endInterval, t1.theDate) - IIF(t2.theDate = (SELECT Min(theDate) FROM theTable), startInterval, t2.theDate)) AS s2, s1 / s2 AS s3
FROM theTable AS t1 RIGHT JOIN
theTable AS t2 ON t2.theDate < t1.theDate
WHERE t1.theDate = (SELECT Min(t3.theDate) FROM theTable t3 WHERE t3.theDate > t2.theDate) OR t1.theDate IS NULL
【讨论】:
非常感谢!这不是我所需要的,但由于您的方法,我找到了我需要的!以上是关于获取区间内加权平均值的总和的主要内容,如果未能解决你的问题,请参考以下文章