在SQL Server中计算可变范围上的stdev

时间:2017-08-04 19:39:35

标签: sql sql-server

表格格式如下:

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等月份范围。

1 个答案:

答案 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”替换为变量。