【问题标题】:How to find the rolling 3 months variance?如何找到滚动的 3 个月方差?
【发布时间】:2018-05-02 09:13:59
【问题描述】:

我有一个包含两列、日期和金额的数据集。我想找到过去 3 个月的方差 (VAR),然后通过按月平均 (AVG) 来聚合方差 (VAR)。我还想确保如果有少于 3 个月的数据可用,则不计算方差。 (所以我有 6 个月的数据,我只有过去 3 个月的平均方差)。非常感谢

注意:我正在使用 SSMS

Date                 Amount
23 February 2017    £41,079
07 January 2017     £25,856
....

【问题讨论】:

  • 超过 3 个值的方差是否有用?
  • 你是对的!我认为最好取每日方差(过去 90 天),然后按月平均?
  • 我相应地编辑了问题,谢谢@Onno
  • 请在本声明中定义“方差”。
  • VAR 中的方差

标签: sql sql-server ssms


【解决方案1】:

如果您对方差的定义与此函数的作用相匹配,您可以使用内置聚合/窗口函数var()

如果您每行有一天,并且愿意接受 90 天为“3 个月”,那么您可以简单地这样做:

select t.*, var(amount) over (order by date rows between 89 preceding and current row) as rolling_var
from t;

如果这些条件不成立,则使用自联接的效率要低得多:

select t.date, t.amount, var(t2.amount)
from t join
     t t2
     on t2.date > dateadd(month, -3, t.date) and t2.date <= t.date
group by t.date, t.amount;

【讨论】:

  • 每天记录不止一条。我尝试基于自加入运行您的第二个建议,但已经运行了 20 多分钟。 (我有 40 万条记录)
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多