调整日期列以便随时间变化

时间:2011-10-13 17:14:52

标签: sql sql-server

这是一个很容易解决的问题,但想知道是否有人能提供更优雅的解决方案。

我有一个表格,其中包含一个日期列(月末日期)和几个值列 - 比如各种股票随时间的价格,每个股票一列。我想计算日期列中表示的每个期间的值列的更改(例如,从填充价格的表中每日返回)。

我目前的计划是将表格加入到自身中,只需为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

1 个答案:

答案 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