Usando
datediff(minute, '1990-01-01T00:00:00', yourDatetime)
ti darà il numero di minuti trascorsi da 1990-1-1 (puoi utilizzare la data di base desiderata).
Quindi puoi dividere per 5, 15, 30 o 60 e raggruppare per il risultato di questa divisione. Ho verificato che verrà valutato come una divisione intera, quindi otterrai un numero intero che puoi utilizzare per raggruppare.
cioè
group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5
AGGIORNAMENTO Poiché la domanda originale è stata modificata per richiedere che i dati vengano mostrati in formato data-ora dopo il raggruppamento, ho aggiunto questa semplice query che farà ciò che vuole l'OP:
-- This convert the period to date-time format
SELECT
-- note the 5, the "minute", and the starting point to convert the
-- period back to original time
DATEADD(minute, AP.FiveMinutesPeriod * 5, '2010-01-01T00:00:00') AS Period,
AP.AvgValue
FROM
-- this groups by the period and gets the average
(SELECT
P.FiveMinutesPeriod,
AVG(P.Value) AS AvgValue
FROM
-- This calculates the period (five minutes in this instance)
(SELECT
-- note the division by 5 and the "minute" to build the 5 minute periods
-- the '2010-01-01T00:00:00' is the starting point for the periods
datediff(minute, '2010-01-01T00:00:00', T.Time)/5 AS FiveMinutesPeriod,
T.Value
FROM Test T) AS P
GROUP BY P.FiveMinutesPeriod) AP
NOTA:l'ho diviso in 3 sottoquery per chiarezza. Dovresti leggerlo dall'interno. Ovviamente potrebbe essere scritta come una query singola e compatta
NOTA:se modifichi il periodo e la data-ora di inizio puoi ottenere qualsiasi intervallo di cui hai bisogno, come settimane a partire da un determinato giorno, o qualsiasi cosa tu possa aver bisogno
Se vuoi generare dati di test per questa query usa questo:
CREATE TABLE Test
( Id INT IDENTITY PRIMARY KEY,
Time DATETIME,
Value FLOAT)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:00:22', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:03:22', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:04:45', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:07:21', 20)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:10:25', 30)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:11:22', 30)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:14:47', 30)
Il risultato dell'esecuzione della query è questo:
Period AvgValue
2012-03-22 00:00:00.000 10
2012-03-22 00:05:00.000 20
2012-03-22 00:10:00.000 30