sql-server - Sql Server 2012 中的递归衰减平均值

标签 sql-server recursion sql-server-2012 common-table-expression

我需要计算一组值的衰减平均值(累积移动?)。系列中的最后一个值是 50% 权重,所有先前系列的衰减平均值作为另一个 50% 权重,递归地。

我想出了一个可以产生正确结果的 CTE 查询,但它取决于连续的行号。我想知道在 SQL 2012 中是否有更好的方法来执行此操作,也许使用 Over() 的新窗口函数或类似的方法?

在实时数据中,行按时间排序。我可以使用 SQL View 和 ROW_NUMBER() 为我的 CTE 方法生成必要的行字段,但如果有更有效的方法来执行此操作,我希望尽可能保持高效。

我有一个包含 2 列的示例表:Row int 和 Value Float。我有 6 个样本数据值 1,2,3,4,4,4。正确的结果应该是 3.78125。

我的解决方案是:

;WITH items AS (
  SELECT TOP 1 
    Row, Value, Value AS Decayed
    FROM Sample Order By Row
  UNION ALL
  SELECT v.Row, v.Value, Decayed * .5 + v.Value *.5 AS Decayed
  FROM Sample v
  INNER JOIN items itms ON itms.Row = v.Row-1
  )
SELECT top 1 Decayed FROM items order by Row desc

测试数据正确生成 3.78125。我的问题是:在 SQL 2012 中是否有更有效和/或更简单的方法来执行此操作,或者这是唯一的方法?谢谢。

最佳答案

一种可能的替代方案是

WITH T AS
(
SELECT      
 Value * POWER(5E-1, ROW_NUMBER() 
                     OVER (ORDER BY Row DESC)
               /* first row decays less so special cased */
              -IIF(LEAD(Value) OVER (ORDER BY Row DESC) IS NULL,1,0))
       as x
FROM Sample
)
SELECT SUM(x)
FROM T

SQL Fiddle

或者使用 60%/40% 更新问题

WITH T AS
(
SELECT   IIF(LEAD(Value) OVER (ORDER BY Row DESC) IS NULL,  1,0.6)
         * Value 
         * POWER(4E-1, ROW_NUMBER() OVER (ORDER BY Row DESC) -1)
       as x
FROM Sample
)
SELECT SUM(x)
FROM T

SQL Fiddle

以上两者都对数据执行单次传递,并且可能使用 Row INCLUDE(Value) 上的索引来避免排序。

关于sql-server - Sql Server 2012 中的递归衰减平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31235304/

相关文章:

SQL Server范围索引的想法

sql-server - Hibernate + MSSQL + 通过 Contains 进行全文搜索

python - 显示背包python递归的最大值和项目

计数 BST 子树,直到找到特定的给定键(中序遍历)

sql-server - 列中的循环 IDENTITY 编号

sql-server - dacpac - CLR 程序集引用路径问题

java - 缓存从存储过程返回的结果

php - 从 Php 5.5 访问 MS SQL

php - 通过 sqlsrv_connect() 连接到 mssql 数据库 - PHP

c - 快速确定递归函数返回的最终值