用于余额交易量(财务查询)的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
这里的一个工作内嵌表值函数(最有效的优化):
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中。
Cade,当我尝试运行此操作时它给我一个关于Order By Clause的错误 - 说它的无效,除非你使用TOP等建议?另外,我不确定你的意思是正常化......虽然工作很好!我还没弄清楚逻辑如何,但如果你能为我解决一些问题,我会试着弄明白! – CraigJSte 2010-05-16 00:56:34
创建函数应该说dbo.OBV不GetStdDev – CraigJSte 2010-05-16 01:05:05
我拿出了底部订单条款...不知道这是完全正确的数据...我认为你是乘以关闭值的差异,我们只需要添加或减去音量(我们可以先将音量乘以.0001?)。我最初说.001,但它会更好地使用0001. – CraigJSte 2010-05-16 01:15:54
我没有看到一个期间的列,是按时间顺序的期间?你能给我们提供一些示例数据和示例输出来说明每种情况吗? – Thomas 2010-05-15 20:42:36
另外,您使用的是哪种数据库产品和版本? – Thomas 2010-05-15 20:43:17
期间只是日期...(查询的所有日期或可用数据的所有日期)。我正在使用SQL 2005.使用以下代码表和输出的数据的OBV的示例如下... – CraigJSte 2010-05-16 00:44:27