SQL在线表函数的问题...查询

时间:2009-11-23 14:36:10

标签: sql sql-server

您好我有以下查询运行一个函数来获取下表中一组代码的标准偏差...

 GO
CREATE TABLE [dbo].[Tickers](
[ticker] [varchar](10) NULL,
[date] [datetime] NULL,
[high] [float] NULL,
[low] [float] NULL,
[open] [float] NULL,
[close] [float] NULL,
[volume] [float] NULL,
[time] [datetime] NULL,
[change] [float] NULL
) ON [PRIMARY]

问题:线下表功能返回STDDEV CALC,SPROC反过来使用它来计算布林带...(平均值+ 2 * STDEV等)......

我得到的一些代码的结果有奇怪的数据......这是代码'ATE'的结果集或只是结果集的样本。

dayno   ticker                  stddev
484    11/13/2009              0.544772123613694         
485    11/16/2009              0.323959874058724          
486    11/17/2009              0.287909129182731         
487    11/18/2009              0.225018517756637         
488    11/19/2009              4.94974746848848E-02      
489    11/20/2009              4.94974746848848E-02    

正如您所看到的,某些代码的最后两个值导致“奇怪的数据”,而实际的代码表在非常正常的范围内。

从下面的行表函数可以看出,最后有一些有趣的东西正在进行,因为它使用了20天的时间段,最后一个值总是返回为NULL,所以我请专家调整这个是彼得想出来的......它通常可以找到,但正如你上面所见,有时却没有 - 有没有人对我如何解决这个困境提出建议?

ALTER FUNCTION dbo.GetStdDev3 (@TKR VARCHAR(10))
RETURNS @results TABLE (
dayno   SMALLINT IDENTITY(1,1) PRIMARY KEY
, [date]  DATETIME
, [stddev] 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],[stddev])
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 [stddev] = (
  SELECT [stddev] FROM @results WHERE dayno = @rowcount-1)
WHERE dayno = @rowcount
RETURN

2 个答案:

答案 0 :(得分:4)

4.94974746848848E-02实际上与0.0494974746848848

相同

你确定这是错误的吗?在我看来它可能只是一个低偏差。

答案 1 :(得分:0)

同样的“d。”说过。最后两个日期的标准偏差很低,但无论如何它随着时间的推移而下降。此外,最后一个更新语句所做的就是将集合中的最后一行(最新日期)设置为倒数第二个值。 (也许“adjsut”可能是“删除”?)