sql >> Base de Datos >  >> RDS >> Sqlserver

Agrupe DateTime en intervalos de 5, 15, 30 y 60 minutos

Usando

datediff(minute, '1990-01-01T00:00:00', yourDatetime)

le dará la cantidad de minutos desde 1990-1-1 (puede usar la fecha base deseada).

Luego puede dividir por 5, 15, 30 o 60, y agrupar por el resultado de esta división. He comprobado que se evaluará como una división entera, por lo que obtendrá un número entero que puede usar para agrupar.

es decir,

group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5

ACTUALIZAR Como la pregunta original se editó para requerir que los datos se muestren en formato de fecha y hora después de la agrupación, agregué esta consulta simple que hará lo que quiere el 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:he dividido esto en 3 subconsultas para mayor claridad. Deberías leerlo de adentro hacia afuera. Por supuesto, podría escribirse como una consulta única y compacta

NOTA:si cambia el período y la fecha y hora de inicio, puede obtener cualquier intervalo que necesite, como semanas a partir de un día determinado, o lo que pueda necesitar

Si desea generar datos de prueba para esta consulta, use esto:

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)

El resultado de ejecutar la consulta es este:

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