如果你希望你的時間間隔啓動對小時,然後這是一個非常簡單的解決方案。
樣本數據
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分鐘的開始。我會在下面提供一個答案,告訴你我的意思 –