Bruger
datediff(minute, '1990-01-01T00:00:00', yourDatetime)
vil give dig antallet af minutter siden 1990-1-1 (du kan bruge den ønskede basisdato).
Så kan du dividere med 5, 15, 30 eller 60 og gruppere efter resultatet af denne division. Jeg har tjekket, at det vil blive evalueret som en heltalsdivision, så du får et heltal, du kan bruge til at gruppere efter.
dvs.
group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5
OPDATERING Da det oprindelige spørgsmål blev redigeret til at kræve, at dataene skal vises i dato-tidsformat efter grupperingen, har jeg tilføjet denne enkle forespørgsel, der vil gøre, hvad OP vil have:
-- 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
BEMÆRK:Jeg har delt dette op i 3 underforespørgsler for klarhedens skyld. Du bør læse den indefra og ud. Det kunne selvfølgelig skrives som en enkelt, kompakt forespørgsel
BEMÆRK:Hvis du ændrer perioden og startdato-tid, kan du få ethvert interval, du har brug for, f.eks. uger, der starter fra en given dag, eller hvad du nu har brug for
Hvis du vil generere testdata for denne forespørgsel, brug denne:
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)
Resultatet af at udføre forespørgslen er dette:
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