获取区间内加权平均值的总和

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 的最高日期。

请注意,我已避免使用 DateTableValue 等词,因为这些是 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

【讨论】:

非常感谢!这不是我所需要的,但由于您的方法,我找到了我需要的!

以上是关于获取区间内加权平均值的总和的主要内容,如果未能解决你的问题,请参考以下文章

如何平滑和绘制 x 与 y 的加权平均值,由 x 加权?

时间序列之加权移动平均

工大助手--加权平均分计算

pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)

Highcharts构建加权平均值图表

Highcharts构建加权平均值图表