Sql Server 2012 中的递归衰减平均值
Recursive Decaying Average in Sql Server 2012
我需要计算一组值的衰减平均值(累积移动?)。系列中的最后一个值是 50% 的权重,递归地使用所有先前系列的衰减平均值作为另一个 50% 的权重。
我提出了一个生成正确结果的 CTE 查询,但它取决于连续的行号。我想知道在 SQL 2012 年是否有更好的方法来执行此操作,也许使用 Over() 的新窗口函数或类似的方法?
在实时数据中,行按时间排序。我可以使用 SQL 视图和 ROW_NUMBER() 为我的 CTE 方法生成必要的 Row 字段,但如果有更有效的方法来做到这一点,我希望保持它的效率可能。
我有一个包含 2 列的示例 table: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 年是否有更有效 and/or 更简单的方法来执行此操作,或者这是唯一的方法吗?谢谢
一个可能的选择是
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
或者使用 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
以上两者都执行单次数据传递,并可能使用 Row INCLUDE(Value)
上的索引来避免排序。
我需要计算一组值的衰减平均值(累积移动?)。系列中的最后一个值是 50% 的权重,递归地使用所有先前系列的衰减平均值作为另一个 50% 的权重。
我提出了一个生成正确结果的 CTE 查询,但它取决于连续的行号。我想知道在 SQL 2012 年是否有更好的方法来执行此操作,也许使用 Over() 的新窗口函数或类似的方法?
在实时数据中,行按时间排序。我可以使用 SQL 视图和 ROW_NUMBER() 为我的 CTE 方法生成必要的 Row 字段,但如果有更有效的方法来做到这一点,我希望保持它的效率可能。
我有一个包含 2 列的示例 table: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 年是否有更有效 and/or 更简单的方法来执行此操作,或者这是唯一的方法吗?谢谢
一个可能的选择是
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
或者使用 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
以上两者都执行单次数据传递,并可能使用 Row INCLUDE(Value)
上的索引来避免排序。