0
我目前正在嘗試計算SQL Server中數據表的滾動平均值。在SQL Server中計算滾動平均值
的公式如下:
Set R = Number of preceding/rolling months to perform the average over
Set Result = 1
For each month in the set of data
Result *= 1 - ItemValue
End For
Result = 1 - POWER(Result, 12/R)
的數據看起來像這樣:
TheDate ItemValue
2013-04-30 0.
2013-05-31 0.0216088580
2013-06-30 0.0087388750
2013-07-31 0.0155987010
2013-08-31 0.0237148940
2013-09-30 0.0258031340
2013-10-31 0.0210051110
2013-11-30 0.0175884900
對於3的R,我期望的結果爲這是:
TheDate Result
2013-06-30 0.158315085
2013-07-31 0.169210386
2013-08-31 0.176340587
2013-09-30 0.231608981
2013-10-31 0.248350685
2013-11-30 0.229305289
爲此,我想我可以創建一個TABLE類型來將前面3個日期傳遞給一個函數,該函數需要用戶定義ed表類型。
CREATE TYPE core.udtRollingAverage AS TABLE
(
Value numeric(18,10)
)
然後創建了一個功能通過行基礎上的行執行計算:
ALTER FUNCTION dbo.CalculateRollingAverage(@RollingAverageTable core.udtRollingAverage READONLY)
RETURNS numeric(18,10)
AS
BEGIN
DECLARE @Result numeric(18,10) = 1;
DECLARE @Count int = (SELECT COUNT(*) FROM @RollingAverageTable);
SELECT @Result = @Result*(1-Value)
FROM @RollingAverageTable
SET @Result = 1 - POWER(@Result, 12/@Count)
return @Result
END
對於單個試驗的情況下,它返回正確的結果:
DECLARE @MyTable AS core.udtRollingAverage
INSERT INTO @MyTable(Value)
VALUES(0.),(0.021608858),(0.008738875);
SELECT dbo.CalculateRollingAverage(@MyTable)
--returns 0.1583150855
最後,我試圖將嵌套選擇傳遞給用戶定義的數據類型:
DECLARE @R int = 3
SELECT data_date, dbo.CalculateRollingAverage(
(SELECT TOP (@R) ItemValue
FROM dbo.MySourceTable
ORDER BY TheDate DESC
)
) AS Result
FROM dbo.MySourceTable
不幸的是,它抱怨說:
Operand type clash: numeric is incompatible with udtRollingAverage
我可以有一個前/滾動月份值高達12
有誰知道我怎樣才能得到它返回我想在結果高效的方式?
這是完美的。我正在走相同的道路 - 我計算出了EXP(SUM(LOG技巧),並用一個OUTER APPLY構建了一個CTE,但是你的速度是我想出的速度的兩倍。 – tone