用于余额交易量(财务查询)的SQL函数

用于余额交易量(财务查询)的SQL函数

问题描述:

我想为平衡交易量(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

这里的一个工作内嵌表值函数(最有效的优化):

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