■環境
SQL Server2016(MicrosoftのSQL)
■やりたいこと
日付 | 金額 |
---|---|
2019/1/1 | 500 |
2019/2/1 | 1000 |
2019/3/1 | 1500 |
例えば上記のようなテーブルがあった場合に、
2行目は
(500 + 1000) / 2 = 750
3行目は
(750 + 1500) / 2 = 1125
といったように、1行前の計算結果を基に移動平均を算出したいです。(1125を取得したいです)
最適な方法が見つからず、質問をさせて頂きました。
お手数ですが、何か良い方法があれば教えて頂ければと思います。
■補足(これはNG)
よく移動平均と聞くとWindow関数を使った解法が見つかりますが、
今回は「1行前の計算結果を基に移動平均を算出したい」のでNGです。
SELECT TOP 1 AVG(金額) OVER(ORDER BY 日付 ASC) AS 結果 FROM 仕入 ORDER BY RANK() OVER(ORDER BY 日付 ASC) DESC
※結果は1000
■現状考えている案
○案1(カーソルを使って回す)
DECLARE crTriggerList CURSOR FOR SELECT 金額, RANK() OVER(ORDER BY 日付 ASC) AS RK FROM 仕入 ORDER BY RK ASC DECLARE @金額 decimal DECLARE @RK bigint DECLARE @結果 decimal OPEN crTriggerList; FETCH NEXT FROM crTriggerList INTO @金額, @RK WHILE @@FETCH_STATUS = 0 BEGIN IF (@RK = 1) SET @結果 = @金額 ELSE SET @結果 = (@金額 + @結果) / 2 FETCH NEXT FROM crTriggerList INTO @金額, @RK; END CLOSE crTriggerList; DEALLOCATE crTriggerList; SELECT @結果 AS 結果
○案2(RANK付けした内容を一次テーブルに書き込んだうえ、再帰クエリで回す)
SELECT 日付, 金額, RANK() OVER(ORDER BY 日付 ASC) AS RK INTO #HOGE FROM 仕入; with [CTE] ([日付], [金額],[RK]) as ( SELECT 日付, 金額, RK FROM #HOGE WHERE RK = 1 UNION ALL SELECT 日付, 金額, RK FROM ( SELECT HOGE.日付, CONVERT(decimal, (HOGE.金額 + [CTE].金額) / 2) AS 金額, HOGE.RK FROM #HOGE AS HOGE INNER JOIN [CTE] ON HOGE.RK = [CTE].[RK] + 1 )AS HUGA ) SELECT 金額 AS 結果 FROM [CTE] WHERE RK IN(SELECT MAX(RK) FROM [CTE])
あなたの回答
tips
プレビュー