本文介紹了SQL Server 2012中的遞歸衰減平均值的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我需要計算衰減平均值(累積移動?)一組值的集合。序列中的最后一個值為50%權重,將所有先前序列的衰減平均值遞歸為另一個50%權重。
我提出了一個CTE查詢,它可以產生正確的結果,但它依賴于一個連續的行號。我想知道在SQL 2012中有沒有更好的方法來做到這一點,也許是使用over()的新窗口函數,或者類似的東西?
在實時數據中,行按時間排序。我可以使用一個SQL視圖和row_number()來為我的CTE方法生成必要的行字段,但是如果有更有效的方法來實現這一點,我希望盡可能地保持高效。
我有一個包含兩列的示例表:行int和值Float。我有6個樣例數據值1、2、3、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 2012中的遞歸衰減平均值的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,