Во-первых, в предложении WHERE вы должны заменить это:
-- reformatted for readability
WHERE x.[DATE] > (
SELECT TOP 1 z.[DATE] FROM TICKERS z
WHERE z.TICKER = @TKR ORDER BY z.DATE ASC
)+20
AND (DATEDIFF(day, x.[date], GETDATE()) <= 730)
С этим:
WHERE x.[DATE] > (
SELECT DATEADD(DAY,20,MIN(z.[DATE]))
FROM TICKERS z WHERE z.TICKER = @TKR
)
AND x.[DATE] > DATEADD(DAY,-731,GETDATE())
Если вы не проверили свою версию и не обнаружили, что она работает быстрее.
Помимо этого, вы можете заменить это табличной функцией с несколькими утверждениями. например:
CREATE FUNCTION dbo.GetStdDev (@TKR VARCHAR(10))
RETURNS @results TABLE (
dayno SMALLINT IDENTITY(1,1) PRIMARY KEY
, [date] DATETIME
, [stdev] FLOAT
)
AS BEGIN
DECLARE @min_sysdate DATETIME, @min_tkrdate DATETIME, @rowcount SMALLINT
SET @min_sysdate = DATEADD(DAY,-731,GETDATE())
SET @min_tkrdate = DATEADD(DAY,20,(
SELECT MIN(DATE) FROM TICKERS WHERE TICKER = @TKR))
INSERT @results ([date],[stdev])
SELECT x.[date], ISNULL(STDEV(y.[Close]),0) AS stdev
FROM Tickers x
JOIN Tickers y ON x.[DATE] BETWEEN DATEADD(DAY,-20,y.[DATE]) AND y.[DATE]
WHERE x.[DATE] > @min_tkrdate
AND x.[DATE] > @min_sysdate
AND x.TICKER = @TKR
AND y.TICKER = @TKR
GROUP BY x.[DATE]
SET @rowcount = @@ROWCOUNT
UPDATE @results SET [stdev] = (
SELECT [stdev] FROM @results WHERE dayno = @rowcount-1)
WHERE dayno = @rowcount
RETURN
END