2010-05-15 33 views
0

我想爲平衡交易量(SQL函數)創建一個函數。 這太複雜了,但是這裏是用戶定義表函數的概要。如果有人能幫助我填補空白,我將不勝感激。 克雷格用於餘額交易量(財務查詢)的SQL函數

CREATE FUNCTION [dbo].[GetStdDev3] (@TKR VARCHAR(10)) 
    RETURNS @results TABLE (
    dayno SMALLINT IDENTITY(1,1) PRIMARY KEY 
    , [date] DATETIME 
    , [obv] FLOAT 
    ) 
    AS BEGIN 

    DECLARE @rowcount SMALLINT 
    INSERT @results ([date], [obv]) 

// CREATE A FUNCTION FOR ON BALANCE VOLUME 
// On Balance Volume is the Summ of Volume for Total Periods 
// OBV = 1000 at Period = 0 
// OBV = OBV Previous + Previous Volume if Close > Previous Close 
// OBV = OBV Previous - Previous Volume if Close < Previous Close 
// OBV = OBV Previous if Close = Previous Close 

// The actual Value of OBV is not important so to keep the ratio low we reduce the 
// Total Value of Tickers by 1/10th or 1/100th 
// For Value of Volume = Volume * .01 if Volume < 999 
// For Value of Volume = Volume * .001 If Volume >= 999 
    FROM Tickers 

    RETURN 

    END 

這是代號表

[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 
) 

這裏是數據的一例

ticker date close volume 
    pzi: 5-10-10 10.94 805 
    pzi; 5-11-10 11.06 444 
    pzi: 5-12-10 11.42 236 
    pzi: 5-13-10 11.3 635 
    pzi: 5-14-10 11 316 

    date obv 
    5-10 996.38 
    5-11 996.82 
    5-12 997.06 
    5-13 996.42 
    5-14 996.11 
+0

我沒有看到一個期間的列,是按時間順序的期間?你能給我們提供一些示例數據和示例輸出來說明每種情況嗎? – Thomas 2010-05-15 20:42:36

+0

另外,您使用的是哪種數據庫產品和版本? – Thomas 2010-05-15 20:43:17

+0

期間只是日期...(查詢的所有日期或可用數據的所有日期)。我正在使用SQL 2005.使用以下代碼表和輸出的數據的OBV的示例如下... – CraigJSte 2010-05-16 00:44:27

回答

0

這裏的一個工作內嵌表值函數(最有效的優化):

CREATE FUNCTION [dbo].[GetStdDev3] (@TKR VARCHAR(10)) 
    RETURNS TABLE 
    AS RETURN (
    WITH Y AS (SELECT * 
        ,OBV_Change = ISNULL(SIGN(currclose - prevclose) 
             * volume, 1000) 
      FROM  (SELECT curr.date 
           ,curr.[CLOSE] AS currclose 
           ,prev.[CLOSE] AS prevclose 
           ,curr.volume 
         FROM  Tickers AS curr 
         LEFT JOIN Tickers AS prev 
           ON prev.ticker = @TKR 
            AND prev.date = (SELECT MAX(date) 
                FROM Tickers 
                WHERE ticker = @TKR 
                  AND date < curr.date 
                ) 
         WHERE  curr.ticker = @TKR 
        ) AS X 
     ) 
SELECT y1.date 
     ,SUM(y2.OBV_Change) AS OBV 
     ,ROW_NUMBER() OVER(ORDER BY y1.date) AS dayno 
FROM Y AS y1 
LEFT JOIN Y AS y2 
     ON y2.date <= y1.date 
GROUP BY y1.date 
) 

我對標準化沒有把握 - 我放棄了這一點 - 添加它可能需要您將其加入到多語句TVF中。

+0

Cade,當我嘗試運行此操作時它給我一個關於Order By Clause的錯誤 - 說它的無效,除非你使用TOP等建議?另外,我不確定你的意思是正常化......雖然工作很好!我還沒弄清楚邏輯如何,但如果你能爲我解決一些問題,我會試着弄明白! – CraigJSte 2010-05-16 00:56:34

+0

創建函數應該說dbo.OBV不GetStdDev – CraigJSte 2010-05-16 01:05:05

+0

我拿出了底部訂單條款...不知道這是完全正確的數據...我認爲你是乘以關閉值的差異,我們只需要添加或減去音量(我們可以先將音量乘以.0001?)。我最初說.001,但它會更好地使用0001. – CraigJSte 2010-05-16 01:15:54