Wenn Sie Ihre Intervalle auf der Stunde zu beginnen, dann ist dies eine ziemlich einfache Lösung.
Beispieldaten
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)
Abfrage
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)
Ergebnis
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
Wenn Sie die Zeiten wollen anders dann zeigen Sie dies tun könnte;
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)
, um dieses Ergebnis zu geben;
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
Wie pro Ihre Kommentare, können Sie diese Abfrage verwenden, um Ihre tatsächlichen Durchschnitt der Instanzen im Intervall auf die nächste Minute abzurunden;
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
Ergebnis;
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
Wollen Sie immer, dass die Intervalle zu jeder vollen Stunde beginnen (08:00, 08:05, 08:10)? –
Nicht nur Stunde; An Tagen auch interessant für mich! – Killcycle
Sicher, Tage ist eine separate Sache (und einfach). Es ist eine einfache Lösung, wenn Sie möchten, dass es zu jeder vollen Stunde startet. Das einzige Problem ist, dass Ihr Ergebnis nicht 3, 8 wäre. Es wäre 2, 7, 10, weil Zeile 10 auf Ihren Daten der Beginn eines neuen 5-Minuten-Zeitraums wäre. Ich werde eine Antwort unten zur Verfügung stellen, um Ihnen zu zeigen, was ich meine –