2016-08-23 79 views
-1

样本数据的平均值:(SQL)SELECT与间隔

enter image description here

我想选择的平均值,每5分钟,例如。

结果应该是像这样的列表:

3 
8 

这个功能应该是:AVG(VALUE), DATEDIFF(datepart, startdate, enddate) with datepart=minute and/or DATEADD (datepart, number, date)

我没有找到一个间隔功能(的Transact-SQL)

更新

我真的想在这里做的例子:

sample

我想点之间的平均值绘制趋势线我必须改变“集群”是指分辨率来计算的话。在这个例子中,我的聚类是1. 2意味着,我会从前3个值得到平均值。我希望我解释得很好!

+0

你是否总是希望在小时(08:00,08:05,08:10)开始间隔? –

+0

不仅是小时;从几天开始它对我也很有趣! – Killcycle

+0

当然,日子是一件单独的事情(很容易)。如果你想让它在一个小时内开始,这是一个简单的解决方案。唯一的问题是你的结果不会是3,8。它会是2,7,10,因为你的数据的第10行将是新的5分钟的开始。我会在下面提供一个答案,告诉你我的意思 –

回答

0

如果你希望你的时间间隔启动对小时,然后这是一个非常简单的解决方案。

样本数据

IF OBJECT_ID('tempdb..#SampleData') IS NOT NULL DROP TABLE #SampleData 
CREATE TABLE #SampleData (ID int identity(1,1), Date datetime, Value int) 
INSERT INTO #SampleData (Date, Value) 
VALUES 
('2016-01-01 08:31:00.000',1.00000) 
,('2016-01-01 08:32:00.000',2.00000) 
,('2016-01-01 08:33:00.000',3.00000) 
,('2016-01-01 08:34:00.000',4.00000) 
,('2016-01-01 08:35:00.000',5.00000) 
,('2016-01-01 08:36:00.000',6.00000) 
,('2016-01-01 08:37:00.000',7.00000) 
,('2016-01-01 08:38:00.000',8.00000) 
,('2016-01-01 08:39:00.000',9.00000) 
,('2016-01-01 08:40:00.000',10.00000) 

查询

SELECT 
dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0) Interval 
,AVG(sd.Value) AvgResult 
FROM #SampleData sd 
GROUP BY dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0) 

结果

Interval     AvgResult 
2016-01-01 08:30:00.000  2 
2016-01-01 08:35:00.000  7 
2016-01-01 08:40:00.000  10 

如果你想在时间显示不同的,那么你可以做到这一点;

SELECT 
dateadd(minute, (datediff(minute,0,sd.Date)/5 * 5) + 3, 0) Interval 
,AVG(sd.Value) AvgResult 
FROM #SampleData sd 
GROUP BY dateadd(minute, (datediff(minute,0,sd.Date)/5 * 5) + 3, 0) 

给出这个结果;

Interval     AvgResult 
2016-01-01 08:33:00.000  2 
2016-01-01 08:38:00.000  7 
2016-01-01 08:43:00.000  10 

根据您的意见,您可以使用此查询来将实际的间隔实例平均值调整为最接近的分钟;

SELECT 
a.AVGDate 
,AVG(sd.Value) AvgResult 
FROM #SampleData sd 
JOIN 
(
    SELECT 
     DATEADD(minute, DATEDIFF(minute,0,DATEADD(s,30,CAST(AVG(CAST(sd.Date AS Float)) AS Datetime))),0) AVGDate 
     ,dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0) Interval 
    FROM #SampleData sd 
    GROUP BY dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0) 
) a 
ON dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0) = a.Interval 
GROUP BY a.AVGDate 

结果;

AVGDate      AvgResult 
2016-01-01 08:33:00.000  2 
2016-01-01 08:37:00.000  7 
2016-01-01 08:40:00.000  10 
+0

Rich,其实就是这样!但第一次应该是2016-01-01 08:33:00.000,因为那是前5个数据集的中间(日期)。 – Killcycle

+0

我刚刚更新了我的答案,请看一下,看看它是你的。 –

+0

差不多。第二个时间段是08:37:00而不是08:37:00,因为它是从ID5到ID9。这是最后一个难点:) – Killcycle

0

由五个聚合计算从时间0和鸿沟分钟的区别:

select min(date), avg(value) 
from t 
group by (datediff(minute, 0, date) - 1)/5; -- SQL Server does integer division 
+0

那就是我得到的。这是错误的,你看到了吗? 1 2016-01-01 08:31:00.000 2.500000 2 2016-01-01 08:35:00.000 7.500000 3 2016-01-01 08:40:00.000 10.000000 PS:如何在此回复帖子的下一行,用于格式化我的数据? :) – Killcycle

+0

只需从datediff函数的结果中减去1,它将按预期工作。即:group by(datediff(minute,0,d)-1)/ 5 – dean