余额上的卷的SQL函数(财务查询)
我想为平衡卷SQL函数创建一个函数。 这是一个太复杂的计算,met无法计算出来,但下面是用户定义表函数的概要。如果有人能帮我填空,我将不胜感激。 克雷格 下面是一个数据示例余额上的卷的SQL函数(财务查询),sql,sql-server-2005,Sql,Sql Server 2005,我想为平衡卷SQL函数创建一个函数。 这是一个太复杂的计算,met无法计算出来,但下面是用户定义表函数的概要。如果有人能帮我填空,我将不胜感激。 克雷格 下面是一个数据示例 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 p
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中可能需要您将其添加到多语句TVF中。我没有看到句点列,句点是否按日期顺序排列?您能给我们一些示例数据和示例输出来说明每个场景吗?另外,您使用的是什么数据库产品和版本?周期只是日期。。。查询的所有日期或可用数据的所有日期。我正在使用SQL2005。OBV使用以下股票代码表和输出数据的示例如下……股票代码日期关闭卷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日期obv 5-10 996.38 5-11 996.82 5-12 997.06 5-13 996.42 5-14 996.11股票日期结束卷\pzi 5-10-10 10.94 805 pzi5-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日期obv 5-10 996.38 5-11 996.82 5-12 997.06 5-13 996.42 5-14 996.11Cade,当我试着运行它时,它给了我一个关于ORDERBY子句的错误——说它无效,除非你使用TOP等等。有什么建议吗?另外,我不知道你所说的正常化是什么意思。。。干得好!我还没有完全弄明白逻辑是怎么回事,但如果你能帮我澄清一些问题,我会设法弄明白的!Create函数应该说dbo.OBV not GetStdDevI取出了底部的ORDERBY子句。。。不确定这是不是正确的数据。。。我想你是在乘以接近值的差值,我们只需要加上或减去体积,我们可以先乘以0.0001吗?。我最初说的是.001,但最好使用0001。@CraigJSte抱歉,我在测试代码后将其插入函数中-您需要在dayno之前从udf ORDER中进行选择。我只是用差值的符号乘以体积。如果规范化是按行进行的,而不是按集进行的,那么是的,您可以在每行上除以1000。我认为这将起作用。。。我刚刚在OBV_Change表达式中添加了volume/1000
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
)