这是一个很容易解决的问题,但想知道是否有人能提供更优雅的解决方案。
我有一个表格,其中包含一个日期列(月末日期)和几个值列 - 比如各种股票随时间的价格,每个股票一列。我想计算日期列中表示的每个期间的值列的更改(例如,从填充价格的表中每日返回)。
我目前的计划是将表格加入到自身中,只需为return = b.price / a.price - 1创建一个新列。代码如下:
select Date, Ret = (b.stock1/a.stock1 - 1)
from #temp a, #temp b
where datediff(day, a.Date,b.Date) between 25 and 35
order by a.Date
这很好用,但是:
(1)我需要为数十种股票执行此操作 - 是否有一种很好的方法来复制计算而不复制和粘贴返回计算并将'stock1'替换为彼此的股票名称?
(2)有没有更好的方法来加入?我现在正在有效地进行交叉连接,只保留相邻的条目(由日期和范围定义),但想知道是否有更好的方法将这样的表连接到自身。
编辑:每个请求,数据都在表单中(我的数据虽然有多个价格列):
Date Price
7/1/1996 349.22
7/31/1996 337.72
8/30/1996 343.70
9/30/1996 357.23
10/31/1996 364.07
11/29/1996 385.04
12/31/1996 383.68
从那时起,我想计算return,生成一个这样的表(再次,为实际表中存在的额外价格列添加额外的列):
Date Ret
7/31/1996 -0.03
8/30/1996 0.02
9/30/1996 0.04
10/31/1996 0.02
11/29/1996 0.06
12/31/1996 0.00
答案 0 :(得分:0)
我会做以下事情。首先,使用月份和年份进行自我加入。我建议您使用年份* 12 +月份数来获得每个月和每年组合的唯一值。因此,2011年1月的价值为(2011 * 12 + 1 = 24133),2010年12月的价值为(2010 * 12 + 12 = 24132)。这样您就可以准确地比较月份而无需在12月到1月期间进行翻滚。接下来,您需要在select子句中提供计算。如果你有不同列中的股票价值,那么你将不得不输入它们a.stock1-b.stock1,a.stock2-b.stock2等。唯一的方法是将数据按到那里只有一个股票价值列,并添加一个stockname列,用于标识该值的库存。
使用月份和年份进行自我加入,以下查询应该有效:
select Date, Ret = (b.stock1/a.stock1 - 1)
from #temp a
inner join #temp b on (YEAR(a.Date) * 12) + MONTH(a.Date) = (YEAR(b.Date) * 12) + MONTH(b.Date) + 1
order by a.Date