Utiliser
datediff(minute, '1990-01-01T00:00:00', yourDatetime)
vous donnera le nombre de minutes depuis le 1990-1-1 (vous pouvez utiliser la date de base souhaitée).
Ensuite, vous pouvez diviser par 5, 15, 30 ou 60 et regrouper par le résultat de cette division. J'ai vérifié qu'il sera évalué comme une division entière, vous obtiendrez donc un nombre entier que vous pourrez utiliser pour regrouper.
c'est-à-dire
group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5
MISE À JOUR Comme la question d'origine a été modifiée pour exiger que les données soient affichées au format date-heure après le regroupement, j'ai ajouté cette requête simple qui fera ce que veut 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
REMARQUE :J'ai divisé cela en 3 sous-requêtes pour plus de clarté. Vous devriez le lire de l'intérieur. Elle pourrait, bien sûr, être écrite sous la forme d'une requête unique et compacte
REMARQUE :si vous modifiez la période et la date-heure de début, vous pouvez obtenir l'intervalle dont vous avez besoin, comme des semaines à partir d'un jour donné, ou tout ce dont vous avez besoin
Si vous souhaitez générer des données de test pour cette requête, utilisez ceci :
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)
Le résultat de l'exécution de la requête est le suivant :
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