SQL Server2012の再帰的減衰平均

DaveInMaine

一連の値の減衰平均(累積移動?)を計算する必要があります。シリーズの最後の値は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

SQLフィドル

または、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フィドル

上記の両方がデータのシングルパスを実行しRow INCLUDE(Value)、ソートを回避するためにインデックスを使用する可能性があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

SQL Server2012の平均とケース

分類Dev

SQL Server2012の1つのクエリの平均と中央値

分類Dev

SQL Server2012のRANDBETWEEN

分類Dev

SQL Server2012関数を使用した階層での値の加算/減算

分類Dev

SQL Server2012の計算列を平均として指定します

分類Dev

SQL Server2012でのMergewithTriggerの使用

分類Dev

SQL Server2012のページ付け

分類Dev

SQL Server2012のSTRING_SPLIT

分類Dev

SQL Server2012の同時挿入

分類Dev

SQL Server2012で同等のOracleAUDSID

分類Dev

SQL Server2012エラーの復元

分類Dev

SQL Server2012クエリの混乱

分類Dev

SQL Server2012の日付列をPIVOT

分類Dev

SQL Server2012のデータ変換

分類Dev

SQL Server2012での断片化の結果に基づいたINDEXの再構築と再編成

分類Dev

SQL Server2012で転置

分類Dev

SQL Server2012クエリ

分類Dev

SQL Server2012でのSQLインジェクション

分類Dev

SQL Server2012の計算列でのCASEの使用

分類Dev

SQL Server2012への移行以降のRAISERRORの問題

分類Dev

SQL Server2012のパフォーマンスの問題

分類Dev

SQL Server2012の日時比較の値が範囲外です

分類Dev

Azure SQL Server2012へのMSAccessの接続文字列

分類Dev

SQL Server2012の週番号と曜日からの日付

分類Dev

SQL Server2012の左結合の問題

分類Dev

SQL Server2012クエリでの日付の使用

分類Dev

SQL Server2012の特定の列に基づく小計

分類Dev

SQL Server2012の結果にUnicode文字が表示されない

分類Dev

SQL Server2012の文字列を行に分割