一連の値の減衰平均(累積移動?)を計算する必要があります。シリーズの最後の値は50%の重みであり、前のすべてのシリーズの減衰した平均が他の50%の重みとして再帰的に使用されます。
正しい結果を生成するCTEクエリを思いつきましたが、それは連続する行番号に依存します。SQL 2012でこれを行うためのより良い方法があるかどうか疑問に思っています。おそらく、Over()の新しいウィンドウ関数、またはそのようなものを使用しますか?
ライブデータでは、行は時間順に並べられています。SQLビューとROW_NUMBER()を使用して、CTEアプローチに必要な行フィールドを生成できますが、これを行うためのより効率的な方法がある場合は、これを可能な限り効率的に保ちたいと思います。
RowintとValueFloatの2つの列を持つサンプルテーブルがあります。1,2,3,4,4,4の6つのサンプルデータ値があります。正しい結果は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でこれを行うためのより効率的および/または簡単な方法はありますか、それともこれが唯一の方法ですか?ありがとう。
考えられる代替案の1つは
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)
、ソートを回避するためにインデックスを使用する可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加