使用SQL LAG函数计算股票收益率

使用SQL LAG函数计算股票收益率,sql,lag,Sql,Lag,我有一个股票价格表,我正试图计算每日回报: Ticker Date price ABC 01/01/13 100.00 ABC 01/02/13 101.50 ABC 01/03/13 99.80 ABC 01/04/13 95.50 ABC 01/05/13 78.00 XYZ 01/01/13 11.50 XYZ

我有一个股票价格表,我正试图计算每日回报:

Ticker       Date        price
ABC         01/01/13    100.00
ABC         01/02/13    101.50
ABC         01/03/13     99.80
ABC         01/04/13     95.50
ABC         01/05/13     78.00
XYZ         01/01/13     11.50
XYZ         01/02/13     12.10
XYZ         01/03/13     13.15
XYZ         01/04/13     14.10
XYZ         01/05/13     15.55
我有一个使用Lag函数计算回报的公式,但我不知道在处理新的股票代码时如何将该值重新设置为NULL

它使用ABC 2013年5月1日的价格计算XYZ 2003年1月1日的回报。XYZ的01/01/03返回值应为空

Ticker       Date        price    RETURN
ABC         01/01/13    100.00    NULL
ABC         01/02/13    101.50    1.50
ABC         01/03/13     99.80   -1.67
ABC         01/04/13     95.50   -4.31
ABC         01/05/13     78.00  -18.32
XYZ         01/01/13     11.50  -85.26
XYZ         01/02/13     12.10    5.22
XYZ         01/03/13     13.15    8.68
XYZ         01/04/13     14.10    7.22
XYZ         01/05/13     15.55   10.28
这是我的剧本:

SELECT Ticker,Date, price,((price / lag(price, 1) OVER (ORDER BY Ticker, [Date])) - 1)* 100 AS 'RETURN'
FROM [dbo].[Temp]
Order by Ticker, Date

我是否需要创建一个循环来计算正确的回报

您想要
按分区

SELECT Ticker, Date, price,
       ((price / lag(price, 1) OVER (PARTITION BY Ticker ORDER BY [Date])) - 1)* 100 AS daily_return
FROM [dbo].[Temp]
Order by Ticker, Date;

可以在日期上使用if语句,如果日期不在合法范围内,则返回null,否则返回公式

(IF date_field<lower_date,null,...............what ever......)

(如果date\u field用您正在使用的数据库标记您的问题。使用带有一个“Ticker”的表,这类问题有一百万个答案,这就是这些表的实际外观;很遗憾,您没有接受最能解决问题的答案。我如何计算每天的运行下降?下降是通过(包括今天的最高价格-今天的价格)-1.对于ABC,1/1、0%和1/2的降价幅度为0%,因为它在这两天都创下新高,1/3(99.8/101.5)的降价幅度为1.7%,1/4的降价幅度为5.9%,1/5的降价幅度为23.2%。我是否需要将最高价格存储在临时变量中?更正:降价=(当前价格/最高价格) - 1@Coding_Newbie…我不清楚您的评论。您的问题似乎是:“我不知道如何在处理新的股票代码时将该值重新设置为NULL。”如果您还有其他问题,请将其作为问题而不是评论提问。