【问题标题】:Moving standard deviation with SQL Server使用 SQL Server 移动标准差
【发布时间】:2015-06-19 03:07:57
【问题描述】:

我有一个程序每天将一个非常大的表的移动平均值缓存到另一个表中,输出如下表所示:

date       AvgNet
---------- ----------------------
2014-05-12 116.553598762874
2014-05-13 116.672864387303
2014-05-14 116.141278835128
2014-05-15 118.067104561961
2014-05-16 117.92175621176
2014-05-19 117.056031596087

如何使用 SQL 计算上表的移动标准差(即每个日期过去 x 行的标准差)?

我已经看到移动平均线的窗口函数和 CTE 解决方案,但据我了解,这些解决方案不能适用于标准差。

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2


    【解决方案1】:

    SQL Server 具有stdev() 函数。但是,它不做累积标准差,所以你需要使用相关子查询或cross apply

    select t.*, t2.stdev10 
    from table t outer apply
         (select stdev(t2.avgnet) as stdev10
          from (select top 10 avgnet
                from table t2
                where t2.date <= t.date
                order by t2.date desc
               ) t2
          ) t2;
    

    【讨论】:

    • 感谢您的回复。我尝试了这个查询,但没有得到预期的结果。第 10 天之后,所有标准差都相同吗?这是一个 sql fiddle 来演示。 sqlfiddle.com/#!6/b9b25/2/0
    • @phosplait 。 . .那是因为我遗漏了一个非常重要的 order by
    • 非常感谢戈登,应该抓住那个。我认为这完成了我所需要的。
    【解决方案2】:

    我看到您使用的是 SQL2008。如果您使用 SQL2012 或更高版本,以下内容就足够了。

    SELECT  * ,
            STDEV(avgnet) 
               OVER ( 
                  ORDER BY date 
                  ROWS BETWEEN 10 PRECEDING AND CURRENT ROW 
               ) AS s
    FROM    dbo.TestData
    

    【讨论】:

    • 很好地指出,因为我认为这有轻微的性能优势。不幸的是,我在 2008 年停留了一段时间。
    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2020-09-18
    • 2011-03-05
    • 2021-07-02
    相关资源
    最近更新 更多