sqlserver中的滚动标准差
我有按对象ID分组的时间序列数据。我想知道如何在滚动的基础上计算每个对象从今天到4天前的所有值的标准偏差。即:sqlserver中的滚动标准差,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有按对象ID分组的时间序列数据。我想知道如何在滚动的基础上计算每个对象从今天到4天前的所有值的标准偏差。即: id date value stdev 12345 24/11/2005 0.0001923076923076920 0.0000000000000000000000 37470 25/11/2005 0.0001923076923076920 0.0000000000000000000000 37470
id date value stdev
12345 24/11/2005 0.0001923076923076920 0.0000000000000000000000
37470 25/11/2005 0.0001923076923076920 0.0000000000000000000000
37470 28/11/2005 0.0001923076923076920 0.0000000000000000000000
37470 29/11/2005 0.0001923076923076920 0.0000000000000000000000
37470 30/11/2005 0.0001923076923076920 0.0000000000000000000000
37470 01/12/2005 0.0001923076923076920 0.0000000000000000000000
37470 02/12/2005 0.0001921229586935640 0.0000000826153837838936
37470 05/12/2005 0.0001923076923076920 0.0000000826153837838936
37470 06/12/2005 0.0001923076923076920 0.0000000826153837838937
67890 07/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 08/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 09/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 12/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 13/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 14/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 15/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 16/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 19/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 20/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 21/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 22/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 23/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 26/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 27/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 28/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 29/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 30/12/2005 0.0001923076923076920 0.0000000000000000000000
67890 02/01/2006 0.0001922984471900390 0.0000000041345423064249
这能奏效吗
;WITH sample_data AS
(
SELECT 12345 as id, '2005-11-24' as date, 0.0001923076923076920 as datas
UNION ALL SELECT 37470 , '2005-11-25' , 0.0001923076923076920
UNION ALL SELECT 37470 , '2005-11-28' , 0.0001923076923076920
UNION ALL SELECT 37470 , '2005-11-29' , 0.0001923076923076920
UNION ALL SELECT 37470 , '2005-11-30' , 0.0001923076923076920
UNION ALL SELECT 37470 , '2005-12-01' , 0.0001923076923076920
UNION ALL SELECT 37470 , '2005-12-02' , 0.0001921229586935640
UNION ALL SELECT 37470 , '2005-12-05' , 0.0001923076923076920
UNION ALL SELECT 37470 , '2005-12-06' , 0.0001923076923076920
)
,sample_data2 AS
(
SELECT
id
,date
,datas
,row_number() OVER (PARTITION BY id ORDER BY date ASC) as row
FROM sample_data
)
,sample_data3 AS
(
SELECT
sd2.id AS id
,sd2.date as Date
,sd2.datas as orig_data
,sd3.datas as prior_data
FROM sample_data2 sd2
LEFT OUTER JOIN sample_data2 sd3 ON sd3.id = sd2.id
AND sd3.row <= sd2.row
AND sd3.row > sd2.row - 5
AND sd2.row > 0
)
SELECT
id
,Date
,MAX(orig_data) as Data_value
,ISNULL(STDEV(prior_data),0) AS STDEV_
FROM sample_data3
GROUP BY
id
,date
你是说四天前还是四笔交易前?2005年12月6日id为37470的STDEV表明,您的意思是事务,而不是使用SQL Server 2012(即将于3月到期),这将变得更加容易。这方面的解决方案有用吗?嗨,我是说在那种情况下是事务性的。一个解决方案将非常有用,因为我将有一段时间无法访问2012。嗨,我想就快到了。但其中一个标准偏差计算不正确,仅使用查询中列出的示例数据:ID日期值SQL STDEV Expected STDEV 12345 24/11/2005 0.00019230769230762307692 0 0 3747025/11/2005 0.00019230762307692 0 3747028/11/2005 0.00019230762307692 0 0 3747029/11/2005 0.0001923076922307692 2.57244E-12 0 3747030/11/2005 0.00019230762307692 0 0 3747001/12/2005 0.00019230762307692 037470 02/12/2005 0.000192122958693564 8.26154E-08 8.26154E-08 37470 05/12/2005 0.00019230762307692 8.26154E-08 8.26154E-08 8.26154E-08 37470 06/12/2005 0.00019230762307692 8.26154E-08 8.26154E-08是否可以用DDL代码发布此消息,以便我可以测试此消息?或者,不是代码的最后一部分,而是选择id…GOUP BY date从样本_data3中选择*并告诉我哪些值不希望包含在STDEV计算中。hi,应包括对象范围内的所有值。以下标准偏差应为0,因为值在指定范围内没有变化: