2016-08-23 3 views
-1

Beispieldaten:(SQL) SELECT den Mittelwert mit Intervall

enter image description here

Ich möchte den Durchschnittswert alle 5 Minuten wählen, zum Beispiel.

Ich habe keine Intervallfunktion finden (Transact-SQL)

AVG(VALUE), DATEDIFF(datepart, startdate, enddate) with datepart=minute and/or DATEADD (datepart, number, date)

: sein sollte

3 
8 

Die Funktionen:

Das Ergebnis sollte eine Liste wie folgt sein Update

Beispiel von dem, was ich wirklich hier tun möchte:

sample

ich die Mittelwerte zwischen den Punkten wollen eine Trendlinie zeichnen ich die „Cluster“ ändern bedeutet die Auflösung es zu berechnen. In diesem Beispiel ist mein Cluster 1. 2 würde bedeuten, dass ich den Durchschnittswert aus den ersten 3 Value-Punkten erhalte. Ich hoffe ich habe es gut erklärt!

+0

Wollen Sie immer, dass die Intervalle zu jeder vollen Stunde beginnen (08:00, 08:05, 08:10)? –

+0

Nicht nur Stunde; An Tagen auch interessant für mich! – Killcycle

+0

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 –

Antwort

0

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 
+0

Rich, das war's! Aber nein das erste Mal sollte 2016-01-01 08: 33: 00.000 sein, denn das ist die Mitte (des Datums) des ersten 5 Datensatzes. – Killcycle

+0

Ich habe gerade meine Antwort aktualisiert, sieh dir an, ob es das ist, wonach du suchst. –

+0

Fast richtig. Die zweite Periode ist 08:37:00 nicht 08:37:00, da es von ID5 zu ID9 ist. Das letzte schwierig :) – Killcycle

0

Berechnen Sie die Differenz in Minuten von der Zeit 0 und dividieren durch fünf für die Aggregation:

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

Das ist was ich bekomme. Das ist falsch, verstehst du? 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: Wie folgt hier in diesem Antwortbeitrag , um meine Daten zu formatieren? :) – Killcycle

+0

nur 1 von dem Ergebnis der datediff Funktion subtrahieren und es wird wie erwartet funktionieren. zB: group by (datediff (minute, 0, d) -1)/5 – dean