表格格式如下:
Date ID subID value
-----------------------------
7/1/1996 100 1 .0543
7/1/1996 100 2 .0023
7/1/1996 200 1 -.0410
8/1/1996 100 1 -.0230
8/1/1996 200 1 .0121
我想将STDEV应用于日期落在指定范围内的值列,并在ID列上进行分组。
期望的输出会像这样:
DateRange, ID, std_v
1 100 .0232
2 100 .0323
1 200 .0423
我有一个有用但又笨重的想法,包括创建一个额外的专栏(我称之为“分区'”)来识别一个'组'采用STDEV的值(通过使用OVER函数和PARTITION BY应用于'分区' ID'变量)。
创建分区变量涉及一个CASE语句,在该语句之前,给定记录根据其在给定范围内的日期分配分区(即
...
, partition = CASE
WHEN date BETWEEN '7/1/1996' AND '10/1/1996' THEN 1
WHEN date BETWEEN '10/1/1996' AND '1/1/1997' THEN 2
...
理想情况下,我能够在变量ID和可变日期范围上应用STDEV和OVER函数分区(例如,对于给定的参考日期,尾随3个月)。一旦这适用于上述3个月的时间,我希望能够使日期范围变量,创建一个额外的' @ dateRange'程序开头的变量,可以运行2,3,6等月份范围。
答案 0 :(得分:0)
我最终找到了解决问题的方法。
您可以将原始表连接到第二个表,其中包含第一个表中唯一的日期列表,应用BETWEEN子句指定所需的范围。
下面的示例查询。
包含列(#excessRets)的初始表: 日期,ID,子ID,值
第二个表,上一个唯一的日期列表,包含列(#dates): 日期
select d.date, er.id, STDEV(er.value)
from #dates d
inner join #excessRet er
on er.date between DATEADD(m, -36, d.date) and d.date
group by d.date, er.id
order by er.id, d.date
要实现上面引用的所需下一步(使范围变量),只需在开始时创建一个变量,并将“36”替换为变量。