如果你希望你的时间间隔启动对小时,然后这是一个非常简单的解决方案。
样本数据
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
你是否总是希望在小时(08:00,08:05,08:10)开始间隔? –
不仅是小时;从几天开始它对我也很有趣! – Killcycle
当然,日子是一件单独的事情(很容易)。如果你想让它在一个小时内开始,这是一个简单的解决方案。唯一的问题是你的结果不会是3,8。它会是2,7,10,因为你的数据的第10行将是新的5分钟的开始。我会在下面提供一个答案,告诉你我的意思 –